Problém s pointery – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s pointery – C / C++ – Fórum – Programujte.comProblém s pointery – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
oxidián0
Grafoman
9. 2. 2015   #1
-
0
-

Potřeboval bych poradit jak vyřešit problémy s pointery. Týká se to knihovny libjpeg

Tady je příklad:

http://afni.nimh.nih.gov/afni/doc/source/jpeg-6b_2example_8c-source.html

Ma řádku 369:

JSAMPARRAY buffer;
/** JSAMPARRAY - a 2-D array of pixels is formed by
  making a list of pointers to the starts of scanlines **/
...
buffer = (*cinfo.mem->alloc_sarray)
                ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);


c_info je struktura s informacemi o souboru. Buffer má být pole s pointery odkazující na buffer ("Output row buffer"). Jde teda o to přidělit tomu paměť. V tom příkladu nahoře je to dobře ale mě to nějak nejde:

Ve struktuře data mám člena:

unsigned char * image_buffer;


Toto je začátek mojí funkce, kde chci přiděli tu paměť:

bool read_jpg_file(pJPEG_DATA data) // call: read_jpg_file(&data);
{
    data->row_bytes_len = data->d_info.output_width * (data->d_info.output_components);
    data->pRowsArray = (data->d_info.mem->alloc_sarray)
                ((j_common_ptr) &data->d_info, JPOOL_IMAGE, data->row_bytes_len, 1);

K data->pRowArray mám tuto hlášku:

warning: assignment from incompatible pointer type

Co dělám špatně a jak to opravit?

Pak tam mám ještě dva podobné problémy ve smyčce pro čtení:

(void) jpeg_read_scanlines(&data->d_info, data->pRowsArray, 1);

warning: passing argument 2 of 'jpeg_read_scanlines' from incompatible pointer type

note: expected 'JSAMPARRAY' but argument is of type 'JSAMPLE ***'|

JSAMPLE jsem ale nikde nedeklaroval.

A poslední chybu mám v main():

jpeg_finish_compress(&data.d_info);


podle example.c mají

jpeg_finish_compress(&cinfo);

note: expected 'j_compress_ptr' but argument is of type 'struct jpeg_decompress_struct *'|
ale já mám cinfo uložení v  &data.d_info (dekompres info pro čtení) a &data.c_info (compress info pro zápis).

Můžete poradit jak to opravit?

Kompletní definice typu pro data:

http://paste.ofcode.org/VNTDAECMAMVJ7ThAvttDwH

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Grafoman
10. 2. 2015   #2
-
0
-

vyřešeno. můžete to vymazat

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Grafoman
10. 2. 2015   #3
-
0
-

Nový problém:

http://paste.ofcode.org/7cqzPT2dTy6bu8sGkiaFYN

Tento text z řádku 118 je v pořádku:

data->pRowsArray[0][t]

ale tady ten samý text hlásí chybu:

           if( !data->pRowsArray[0][t+1] ) {
                // set all values to V
                data->pRowsArray[0][t]=pRowsArray[0][t+2];
                data->pRowsArray[0][t+1]=data->pRowsArray[0][t+2];
                continue;
            }


175|error: array subscript is not an integer|

175|error: 'pRowsArray' undeclared (first use in this function)|

175|note: each undeclared identifier is reported only once for each function it appears in|

Ale je to všechno v jedné funkci tak nechápu jak může být nedeklarovaný

Nahlásit jako SPAM
IP: 78.45.199.–
10. 2. 2015   #4
-
+1
-
Zajímavé

   

data->pRowsArray[0][t]=pRowsArray[0][t+2];

nemá tam být  

data->pRowsArray[0][t]=data->pRowsArray[0][t+2];

?

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:f529:1f...–
oxidián0
Grafoman
10. 2. 2015   #5
-
0
-

jo, to byla jedna chyba. Na tu druhou jsem už přišel. Dík.

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Grafoman
17. 3. 2015   #6
-
0
-

Tak zase řeším problém s pointery. Mám tyto tři funkce, které čtou data z bufferu:

void read1byte(unsigned char ** pSourceStr, unsigned char* item)
{
  memcpy(item,*pSourceStr,1);
  *pSourceStr++;
}
void read2bytes(unsigned char ** pSourceStr, uint16_t* item)
{
  memcpy(item,*pSourceStr,2);
  *pSourceStr+=2;
}
void read4bytes(unsigned char ** pSourceStr, uint32_t* item)
{
  memcpy(item,*pSourceStr,4);
  *pSourceStr+=4;
}

Zatím jsem používal jen read4bytes a nezaznamenal jsem žádný problém že by se načetly nesprávné hodnoty.

Teď dělám tuto smyčku ve které se mají načítat jednotlivé záznamy, ale jsou tam už nové funkce read1byte a read2bytes:

begin3 = begin4 + ssh[n].file_offset;
for (;n<sh[n].subsections_count; n++){
    if (sh[n].type==ST_TerrainIndex){
       trqh[n] = malloc( sizeof(TRQ1_RECORD_t) );
       section_read_size = 0;
       for (i=0; section_read_size<ss_sizes[n] ; i++){
         read4bytes(&begin3, &trqh[n][i].sig);
         read4bytes(&begin3, &trqh[n][i].size);
         read2bytes(&begin3, &trqh[n][i].type);
         read1byte(&begin3, &trqh[n][i].compressionType1);
         read1byte(&begin3, &trqh[n][i].compressionType2);
          }
}
}


První dvě položky se načetly správně (prohlížím si objekt trqh[n][i] ve watch panelu).

ještě než načtu type hodnota je 3131961357. Načtu a hodnota se změnila na

3131899913

type je ale typ enum a tak vím že to je nesprávná hodnota.

dále compressionType1 má 3131961357

načtu, skočí mi to do té funkce, kde mám breakpoint za memcpy.

*item: 7 '\a'

to je správná hodnota (je to první byte z *pSourceStr[0]).

jdu dále, a když vyjedu z té funkce read1byte tak hodnota není uložená a je tam: 3131961351

ještě dodám že item byla: (unsigned char *) 0x3e297c "\ađ­ş\rđ­ş\rđ­ş\rđ­ş\rđ­ş\rđ­ş\rđ­ş\rđ­ş\rđ­ş««««««««"

hlavně mezi těma funkcema nevidím žádný podstatný rozdíl v pointerech takže nechápu.

Nahlásit jako SPAM
IP: 78.45.199.–
KIIV
~ Moderátor
+43
God of flame
17. 3. 2015   #7
-
0
-

minimalne se zatracene dobre ujisti, ze *pSourceStr++; je to samy jako *pSourceStr+=1; protoze existujou taky priority a mam takove tuseni, ze ++ je pred dereferenci.

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
17. 3. 2015   #8
-
0
-

no jestli ti 16b hodnota ukazuje 3miliardy, tak mas problemu jeste mnohem vic

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
17. 3. 2015   #9
-
0
-

Klidně tam dám += 1 ale to neřeší můj problém...

Proč item ukazuje ten divný řetězec? Měl by odkazovat na pointer a ne na pole.

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Grafoman
17. 3. 2015   #10
-
0
-

Ale to není 16b to je enum.

item: (uint16_t *) 0x3e2978

*item: 61453 // neiniciováno

*item: 9 // nastaveno

až po vrácení funkce je problém

před iniciací členů té struktury trqh[n][i] mají všechny členové hodnotu

3131961357

Nahlásit jako SPAM
IP: 78.45.199.–
KIIV
~ Moderátor
+43
God of flame
18. 3. 2015   #11
-
0
-

Zaklady, zaklady - a co je enum? Spravna odpoved: int

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
18. 3. 2015   #12
-
0
-

No však já se tomu nedivím že je to int! Já se jen ptám proč to není nastavené když vracím funkci? To jako protože jsou odlišného typu?

Ani s typem uint32_t to nefunguje:

void read1byte(unsigned char ** pSourceStr, uint32_t* item)
{
  memcpy(item,*pSourceStr,1);
  *pSourceStr+=1;
}
void read2bytes(unsigned char ** pSourceStr, uint32_t* item)
{
  memcpy(item,*pSourceStr,2);
  *pSourceStr+=2;
}


stále se nenastaví. Ale v tomto případě to už ani položka item nemá správné číslo a je tam vysoké číslo. To unsigned char aspoň nastavilo správnou hodnotu pro *item

Nahlásit jako SPAM
IP: 78.45.199.–
KIIV
~ Moderátor
+43
God of flame
18. 3. 2015   #13
-
0
-

a zkusil si tu hodnotu nejprve vynulovat a pak tam teprve zkopirovat treba polovinu bajtu?  (kdyz je to 32b cislo a pak tam pomoci memcpy zkopirujes 2 ze 4, tak dva dalsi zustavaji potencialne neinicializovane a u little endianu to budou prave ty s nejvyssi hodnotou)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
18. 3. 2015   #14
-
0
-

No vidíš. Ty si tak chytrý :-) Dík za radu!

Nahlásit jako SPAM
IP: 78.45.199.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 77 hostů

Podobná vlákna

Problém s pointery. — založil Sám_už_nevím

Problém s pointery c# — založil Kalgys

C++ pointery — založil jane32

Pointery v C — založil chef06

Pointery — založil inferno-girl

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý