Nastavení pointeru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nastavení pointeru – C / C++ – Fórum – Programujte.comNastavení pointeru – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
oxidián0
Expert
8. 8. 2017   #1
-
0
-

Mám tyto dvě struktury:

typedef struct {
    int skip_lines;
    int num;
    int i;correctly and then not to change!
    char filename[70];
    char main_directory[16];
    char submain_directory[100];
} TABLE_;

typedef struct {
    TABLE_ radiation_insolation[7];
    TABLE_ radiation_radiation[5];
    TABLE_ winds[9];
    TABLE_ pressure[1];
    TABLE_ humidity[1];
    TABLE_ temperature[4];
} TABLES;

ve funkci main dělám toto:

TABLES tables;
TABLES * table_types[TABLE_TYPES_NUM]; // 6 - count of table types
table_types[0] = tables.radiation_insolation;
// int si = sizeof( *(table_types[0]) ); // insolation size 5400 checked
table_types[1] = tables.radiation_radiation;
table_types[2] = tables.winds;
table_types[3] = tables.pressure;
table_types[4] = tables.humidity;
table_types[5] = tables.temperature;
initiate(&tables);
readfiles(&tables, table_types);

radiation_insolation je pole typu TABLE_ o rozměru 7. funkce initiate načte data ze souboru do 7 tabulek typu radiation_insolation. Pak spouštím funkci readfiles, respektive preaparBuffer kde řeším následující věc:
 

prepareBuffer(&tables, rowBuf, table_types);
char * prepareBuffer(TABLES * tables, char * buf, TABLES * table_types);
    TABLE_ * t;
    int currentTableElementsNum = 0;
    int offset = 0;
    // iterrate through table types.
    t = &(table_types[i]);
    for(i = 0; i<TABLE_TYPES_NUM; i++) // count of tables
        {
        t += offset;
        offset += sizeof(table_types[i]);
        }

V prvním cyklu t je (TABLE_ *) 0x22ea20

offset je 5400, což se shoduje s testem velikosti, který jsem dělal přímo v main().

V druhém cyklu chci nastavit ukazatel na následující pole tabulek, kterým je
radiation_radiation o rozsahu 5.

Myslel jsem si že pozice na následující pole tabulek se vypočítá takto:


offset += sizeof(table_types[i]);
t += offset; // nastavit pointer t + offset
no, ale v druhém cyklu dostávám že t ukazuje na nepřístupnou část paměti 0x3364e0.

Podle mých výpočtů by adresa měla být

t: 0x22ea20 + 5400 dec čili (0x22ea20  + 0x1518) = **0x22FF38**

Kde tedy dělám chybu, že to neukazuje správně na druhou sadu tabulek?

Nahlásit jako SPAM
IP: 78.102.61.–
8. 8. 2017   #2
-
0
-

Jen namátkou:
1. table_types je pole struktur. O několik řádků níž plníš jenotlivé prvky ( = struktury) položkami struktur. Výsledkem je, že se zdaleka neshoduje datový typ. Co na to překladač? Tohle není javascript!!!

2. Ještě před vstupem do cyklu: jaká je hodnota proměnné i?

3. cyklus na určení velikosti pole je nesmyslný. V době překladu je známa velikost pole daná makrem
TABLE_TYPES_NUM, tím mohu určit index posledního prvku a počítat ofset z adres prvního a posledního prvku. Dále je při překladu známa velikost prvku pole (přesněji jeho datového typu) a tak lze ofset počítat jako násobek velikosti prvku a počtu prvků.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
KIIV
~ Moderátor
+42
God of flame
8. 8. 2017   #3
-
0
-

#1 oxidián

Souhlas s hluchymuchem. Naprosto nahodile pouzivani typu, jeste nahodnejsi pokusy o prirazeni, stale nechapes rozdil mezi  "neco * pointer"  a "neco pole[n]", naduzivani sizeof (+ predchozi), ...

Si mel misto C radeji zkusit C++, tam by nektere ty konstrukce s objekty mohly i fungovat, nicmene by te to furt kopalo do riti za nekompatibilni prirazeni a tak... 

Mohl si radeji dat celej kod. Takhle se blbe testuje, kolik zmen by clovek musel udelat, aby se to rozjelo.

Nahlásit jako SPAM
IP: 37.188.254.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
8. 8. 2017   #4
-
0
-

#2 hlucheucho
1. table_types je pole struktur. O několik řádků níž plníš jednotlivé prvky ( = struktury) položkami struktur.

typedef struct {
    TABLE_ radiation_insolation[7];
    TABLE_ radiation_radiation[5];
    TABLE_ winds[9];
    TABLE_ pressure[1];
    TABLE_ humidity[1];
    TABLE_ temperature[4];
} TABLES;

Tak já předpokládal, že každá položka má jinou velikost (rozměr pole je 7, pak 5, pak 9, pak 1, 1 a nakonec 4 ),

Pokud by to ale byly pointery na pole tak by bylo jasné že velikost celého typu TABLES by byla 6*sizeof(int) a nebylo by co řešit.

2) i=0 je začátek cyklu. V cyklu budou funkce.
3) "V době překladu je známa velikost pole daná makrem
TABLE_TYPES_NUM,"

A k čemu mi to je dobré, když velikost každé položky (členu struktury TABLES tables) je jiná?

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
462 příspěvků
8. 8. 2017   #5
-
0
-

Když k ukazateli na strukturu přičteš její velikost, tak dostaneš ukazatel ukazující ZA tu strukturu, ne někam dovnitř. Zároveň nedostaneš ukazatel posunutý o X bajtů, ale o X těch struktur. (jako X * sizeof).

V té funkci máš TABLES * table_types, takže ten sizeof ti bude pořád vracet sizeof TABLES. Až to opravíš podle toho, co tam opravdu dáváš (pole ukazatelů na TABLE_), tak z toho velikost těch polí zase nedostaneš. A zdá se, že to ani nepotřebuješ.

K členům struktury se dostaneš tak jako vždycky "vnořením" do ní.

TABLES t, *p;
sizeof(t.radiation_radiation)
sizeof(p->radiation_radiation)

Jinak je na zjištění offsetu makro offsetof.

offsetof(TABLES, radiation_radiation)

Ale určitě to nepotřebuješ a jen na to zase jdeš nesmyslně složitě. Kdyby bylo jasnější o co se pokoušíš, tak by se dalo radit více.

Nahlásit jako SPAM
IP: 213.211.51.–
Jerry
~ Anonymní uživatel
120 příspěvků
8. 8. 2017   #6
-
0
-

#1 oxidián
a jsi si uplně jistý, že bude fungovat přiřazení:

table_types[0] = tables.radiation_insolation;

když table_types[0] je TABLES a ty se mu snažíš přiřadit ukazatel na typ TABLE_ ???

maš nějak totálně zmatlanej začátek, ty budeš určo programátor v Javě co ?

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:c8f:7...–
oxidián0
Expert
8. 8. 2017   #7
-
0
-

#5 gna
Pochopil jsem to že jsem to špatně deklaroval. Ta proměnná byla něco jiného než jsem si myslel.

Teď se už ale zaměřuji na jiné řešení.

1) přejmenoval jsem tu proměnnou aby se mi to nepletlo

2) pochopil jsem to že potřebuji pointer to arrays of array of type TABLE_

ale dávat tam typ TABLE_ ** by znamenalo alokovat paměť a nevypadá to jako dobré řešení.

Nyní mám toto:

    TABLE_ *table_arrays[] = {
    tables.radiation_insolation,
    tables.radiation_radiation,
    tables.winds,
    tables.pressure,
    tables.humidity,
    tables.temperature
};

A z toho budu vycházet.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Expert
8. 8. 2017   #8
-
0
-

#6 Jerry
Vyrostl jsem na PHP 3-4, v menší míře Javascript a JQuery. Později jsem se věnoval AHK. V posledních letech jsem se věnoval kromě programování v jiných jazycích i programu Sketchup na čemž jsem strávil měsíce. Tudíž není pravda co si o mě hu myslí, že jsem veškerý čas tří let věnoval jenom C/C++.

Nahlásit jako SPAM
IP: 78.102.61.–
Jerry
~ Anonymní uživatel
120 příspěvků
8. 8. 2017   #9
-
0
-

#8 oxidián
možná by bylo lepší dát zadání nebo strukturu dat ... víš....to co máš je opět "nějak" divný :)

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:c8f:7...–
KIIV
~ Moderátor
+42
God of flame
8. 8. 2017   #10
-
0
-

#7 oxidián
To by fungovat mohlo, jen se bude blbe poznavat konec a bude velka pravdepodobnost, ze budes zasahovat mimo rozsah.

Coz se obvykle delalo NULL pointerem za posledni pozici (stejne jako ukoncovaci znak NUL v retezcich). Nicmene se to tezko dela pro staticke pole.

Nahlásit jako SPAM
IP: 37.188.254.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jerry
~ Anonymní uživatel
120 příspěvků
8. 8. 2017   #11
-
+1
-
Zajímavé

hele už se na to nemužu koukat, tadyněco máš a možná se ti to hodí :)

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"

#include <stdio.h>
#include <string.h>


typedef struct {

  int  skip_lines; //4
  int  num; //4
  int  i; //4
  char filename[70]; //70
  char main_directory[16]; //16 
  char submain_directory[100]; //100

} ts_table_item;

typedef struct {

 ts_table_item radiation_insolation[7];
 ts_table_item radiation_radiation[5];
 ts_table_item winds[9];
 ts_table_item pressure[1];
 ts_table_item humidity[1];
 ts_table_item temperature[4];
 
} ts_Tables;

int main()
{

    ts_Tables      tables;
    ts_table_item *tableTypes[6]; // = { tables.;

    tableTypes[0] = &(tables.radiation_insolation[0]);
    tableTypes[1] = &(tables.radiation_radiation[0]);
    tableTypes[2] = &(tables.winds[0]);
    tableTypes[3] = &(tables.pressure[0]);
    tableTypes[4] = &(tables.humidity[0]);
    tableTypes[5] = &(tables.temperature[0]);

    for ( int i = 0; i < 6; ++i ) {

        ts_table_item *item = tableTypes[i];

        item->skip_lines = 1;
        item->num = 2;
        item->i = 3;
        strcpy(item->filename, "0123456789012345678901234567890123456789012345678901234567890123456789");
        strcpy(item->main_directory, "0123456789012345");
        strcpy(item->submain_directory, "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");

    }// for

    for (int i = 0; i < 6; ++i) {

     ts_table_item *item = tableTypes[i];

     printf("%i \n", item->skip_lines );
     printf("%i \n", item->num);
     printf("%i \n", item->i);
     printf("%s \n", item->filename);
     printf("%s \n", item->main_directory);
     printf("%s \n", item->submain_directory);

    }// for

    char string[256];
    gets_s(string);

    return 0;
}
Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:c8f:7...–
oxidián0
Expert
8. 8. 2017   #12
-
0
-

#10 KIIV
Použil jsem google abych si vyhledal něco o statických polích a vypadlo mi toto:

Static arrays are allocated memory at compile time and the memory is allocated on the stack. Whereas, the dynamic arrays are allocated memory at the runtime and the memory is allocated from heap.

Ale v komentářích jsem našel nějaké rozpory. Je ta věta pravdivá nebo pomýlená?

Nahlásit jako SPAM
IP: 78.102.61.–
Jerry
~ Anonymní uživatel
120 příspěvků
9. 8. 2017   #13
-
0
-

#12 oxidián
to už bohužel neplatí, u nových kompilerů pro windows a taky u některých verzí Linuxu atd. statické proměnné mohou ale nemusí být alokované na zásobníku je to k vzteku ale je to tak souvisí to s memory managementem windows a je to dost složité, hele proč vlastně pokročilý programátor v PHP/Javě/JQuery/JScript (7 černých koleček na foru) se takhle  hrozněmoc vnucuje do céčka ? jako PHPkář si v praze vyděláš 60-80k o tom se céčkařům ani nezdá.  Víš vubec že se to budeš učit min. 5-6 let ? nebo prostě jenom nemáš do čeho píchnout a prudíš :)) všimnul jsem si že tady sou občas takový z hlediska programování fakt úchylný otázky jako kdyby se ptal někdo s kolečkem navíc :)) no možná že mu nějaký kolečko chybí :)) Možná je to móda a měl bych zkusit přihlásit se jako PHP programátor :)) jinak ta tvoje analýza problému jehož zadání si uvedl na začátku jako dotaz je uplně obráceně než by měla být. ... měl by ses nad sebou zamyslet :)) pokud ti to de ztuha zkus C++/CX to je akční nový prog.jaz. pro Win10 a budoucí léta...

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:a467:...–
MilanL+1
Super člen
9. 8. 2017   #14
-
0
-

#13 Jerry
no ty kolečka neznamenají pokročilost spíš aktivitu (čas a počet příspěvků).

Podle mě vypadá na zaměstnance nějaký školy (IT nebo učitel) a skáče od jednoho k druhýmu, není to tak dávno cca před 2-3 měsíci tu řešil problémy s programováním v Delphi - Zkoušení slovíček orientálních jazyků.

Na druhou stranu, pro mě jsou ty jeho témata zdrojem jak něco [ne]dělat.

Nahlásit jako SPAM
IP: 91.139.9.–
9. 8. 2017   #15
-
0
-

#13 Jerry
On a zamyslet se nad sebou? To chceš od něj moc.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
9. 8. 2017   #16
-
0
-

Nauč se jeden jazyk pořádně a ten dělej. A hlavně základy, důkladně. Že jsi 3 roky nedělal jen céčko... a co má být? Takových, co to nedělají kontinuálně nebo dělají i jiné jazyky popř i jiné činnosti (jako já) je tady na fóru plno. Když si nemůžeš na něco vzpomenout, projdi si pro připomenutí  nějaký tutoriál. Jestli jsi takhle prasil PHP a další, tak pěkně děkuji. Možná to bude vysvětlení proč nějaká webová aplikace padá   

hu

Nahlásit jako SPAM
IP: 193.86.81.–
oxidián0
Expert
13. 8. 2017   #17
-
0
-

#11 Jerry

napsal si

tableTypes[0] = &(tables.radiation_insolation[0]);

Akorád, že já potřebuju toto:

tableTypes[0] = &(tables.radiation_insolation);

Mně víc vyhovuje psát místo tableTypes table_arrays.

Ke členu num bych tedy měl přistupovat takto:

table_arrays[0][0].num

nebo table_arrays[i][j].num

Teď zkouším toto:

table_arrays[0] = &(tables.radiation_insolation);

TABLE_ test_tab = table_arrays[0][0];

test_tab.num = 999;
initiate(&tables, &test_tab);

...

void initiate(TABLES * tables, TABLE_ * test_tab){

tables->radiation_insolation[0].num = 7;

// tady mám break point a podívám se do kukátka na test_tab.num

V kukátku bych měl vidět test_tab: 7, ale vidím 999

ještě uvažuju nad tím proč to funguje jinak než bych očekával. Zkoušel jsem to do té funkce dostat i jako
TABLE_ test_tab, ale výsledek je stejný.
 

Nahlásit jako SPAM
IP: 78.102.61.–
BDS+2
Věrný člen
13. 8. 2017   #18
-
0
-

#16 hlucheucho
Mistru oxidiánu je jakákoliv rada zbytečná. Za dva roky sice nepokročil přes lekci "ukazatel", ale zato dokáže napsat kód a následně svůj dotaz, složitějším způsobem než předtím.

Nahlásit jako SPAM
IP: 185.69.69.–
Visual Studio C/C#/C++
(pouze samouk)
oxidián0
Expert
13. 8. 2017   #19
-
0
-

#18 BDS
Jestli ti jde o to že používám funkci initiate, tak tu používám už od samého začátku, jen jsem ji sem neuváděl. Kód o 106 řádcích by nikoho nezajímal.

Nahlásit jako SPAM
IP: 78.102.61.–
KIIV
~ Moderátor
+42
God of flame
13. 8. 2017   #20
-
0
-

#19 oxidián
Jak jsem psal ve tretim prispevku: mel si dat cely kod (klidne nekde na pastebin, cppshell nebo tak).

To:

tableTypes[0] = &(tables.radiation_insolation[0]);

sedi k typum, ktere pouzil. Ikdyz se da vyuzit toho, ze jednorozmerne pole je zamenitelne s pointerem (akorat se ztrati jeho rozmer). Proste se dalo napsat primo:

tableTypes[0] = tables.radiation_insolation;
Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
13. 8. 2017   #21
-
0
-

#20 KIIV

Dalo napsat přímo. To jsem tam měl ne? Původně jsem tam měl:

TABLES * table_types[TABLE_TYPES_NUM]; // 6table_arrays[0] = tables.radiation_insolation;
table_arrays[1] = tables.radiation_radiation;
table_arrays[2] = tables.winds;
table_arrays[3] = tables.pressure;
table_arrays[4] = tables.humidity;
table_arrays[5] = tables.temperature;

Pak nevím proč to Jerry přepisoval. Myslel jsem že to mám špatně.

edit:

Nesedí mi tam ty adresy:

očekávám že ve funkci initiate se table_arrays.radiation_insolation[0].num nastaví na 7

ale hodnota je 2289584...

To znamená, že table_arrays[0] neodkazuje na adresu tables.radiation_insolation. ... &table_arrays odkazuje na (TABLES *) 0x22ea14 ... ale &tables->radiation_insolation odkazuje na (TABLE_ ()[7]) 0x22ea38 ...

a

&(table_arrays)[0] odkazuje na (TABLES *) 0x22ea20.

takže mi to nesedí.

Nahlásit jako SPAM
IP: 78.102.61.–
KIIV
~ Moderátor
+42
God of flame
13. 8. 2017   #22
-
0
-

#21 oxidián
puvodne si to mel uplne blbe, protoze nesedely datove typy.

Mel si table_types typu pole pointeru na TABLES, ale na ty pozice v poli jsi cpal pointer na TABLE_.

---

Edit:

Neco nefunguje. Bez kodu neni odpoved. Potrebujeme KOMPLETNI MINIMALNI ZKOMPILOVATELNOU UKAZKU PROBLEMU. Uz sem davno ztratil prehled, co tam mas za zverstvo, otestovat si to sam nemuzu, protoze bych si to musel naprogramovat od zacatku (a jeste bych to udelal spravne), takze bych beztak chybu nenasimuloval.

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+42
God of flame
13. 8. 2017   #23
-
0
-

#23 oxidián
je sakra rozdil mezi:  

int pole[n];

//  pole    -->  pointer typu  int[n]  (int*) (ukazatel na prvni prvek)
// &pole    -->  pointer typu  (int[n])* (ale u pole nejspise ukazuje na stejne misto jako pole)
//               a neda se to zamenit s  int**!!!
// &pole[0] -->  to same jako prvni varianta ale je to ciste int*
Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
Nahlásit jako SPAM
IP: 78.102.61.–
BDS+2
Věrný člen
13. 8. 2017   #25
-
0
-

#24 oxidián  

//tahle smyčka nemá žádný smysl:
for(i = 0; i<TABLE_TYPES_NUM; i++) // count of tables
        {
        TABLE_ * table_item = &(table_arrays[i]);
        currentTableElementsNum = (table_item[0]).num;
        }
// a char * prepareBuffer nic nevrací
//------------------------------------
//tady zbytečně pracuješ s neinicializovanou proměnnou tables:
   table_arrays[0] = tables.radiation_insolation;
    table_arrays[1] = tables.radiation_radiation;
    table_arrays[2] = tables.winds;
    table_arrays[3] = tables.pressure;
    table_arrays[4] = tables.humidity;
    table_arrays[5] = tables.temperature;
 //není lépe provádět ten kód podle logiky aplikace?
//------------------------------------
// a co plánuješ s tímto, taky nevím:
TABLE_ *table_arrays[6];
//lépe řečeno k čemu je to dobré

a taky nechápu smysl zakládat pole o velikosti 1.

Nahlásit jako SPAM
IP: 185.69.69.–
Visual Studio C/C#/C++
(pouze samouk)
KIIV
~ Moderátor
+42
God of flame
13. 8. 2017   #26
-
0
-

   

$ gcc -Wall -pedantic test.c
test.c: In function ‘prepareBuffer’:
test.c:64:9: warning: unused variable ‘offset’ [-Wunused-variable]
     int offset = 0;
         ^
test.c:63:9: warning: variable ‘currentTableElementsNum’ set but not used [-Wunused-but-set-variable]
     int currentTableElementsNum = 0;
         ^
test.c:61:9: warning: unused variable ‘shift’ [-Wunused-variable]
     int shift;
         ^
test.c:60:10: warning: unused variable ‘filename’ [-Wunused-variable]
     char filename[400];
          ^
test.c: In function ‘readfiles’:
test.c:75:35: warning: passing argument 3 of ‘prepareBuffer’ from incompatible pointer type [-Wincompatible-pointer-types]
     prepareBuffer(tables, rowBuf, table_arrays);
                                   ^
test.c:59:8: note: expected ‘TABLE_ * {aka struct <anonymous> *}’ but argument is of type ‘TABLES * {aka struct <anonymous> *}’
 char * prepareBuffer(TABLES * tables, char * buf, TABLE_ * table_arrays){
        ^
test.c:73:10: warning: unused variable ‘prevBuf’ [-Wunused-variable]
     char prevBuf [ROW_LENGHT];
          ^
test.c: In function ‘main’:
test.c:88:24: warning: passing argument 2 of ‘readfiles’ from incompatible pointer type [-Wincompatible-pointer-types]
     readfiles(&tables, &table_arrays);
                        ^
test.c:71:6: note: expected ‘TABLES * {aka struct <anonymous> *}’ but argument is of type ‘TABLE_ * (*)[6] {aka struct <anonymous> * (*)[6]}’
 void readfiles(TABLES * tables, TABLES * table_arrays){
      ^
test.c: In function ‘prepareBuffer’:
test.c:70:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

Opravil jsem to tak, aby aspon sedely datove typy (ale netestovano, jelikoz tam zadne testy nemas):

char * prepareBuffer(TABLES * tables, char * buf, TABLE_ * table_arrays[]){
    int i;
    int currentTableElementsNum = 0;
    for(i = 0; i<TABLE_TYPES_NUM; i++) // count of tables
    {
        currentTableElementsNum += table_arrays[i]->num;
    }
    // something with currentTableElementsNum
    return NULL;
}
void readfiles(TABLES * tables, TABLE_ * table_arrays[]){
    char rowBuf [ROW_LENGHT];
    memset ( rowBuf, 0, ROW_LENGHT );
    prepareBuffer(tables, rowBuf, table_arrays);
}
int main()
{
    TABLES tables;
    TABLE_* table_arrays[6];
    table_arrays[0] = tables.radiation_insolation;
    table_arrays[1] = tables.radiation_radiation;
    table_arrays[2] = tables.winds;
    table_arrays[3] = tables.pressure;
    table_arrays[4] = tables.humidity;
    table_arrays[5] = tables.temperature;

    initiate(&tables);
    readfiles(&tables, table_arrays);
    return 0;
}
Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
13. 8. 2017   #27
-
0
-

#25 BDS
Tak jistě, KIIV po mě chtěl minimální zkompilovatelný kód.

Pravda, to nastavení pointerů na jednotlivé členy tables bude lépe přesunout za initiate.

#26 KIIV
Zapomněl jsem uvést, že jde o tento řádek

currentTableElementsNum = (table_item[0]).num;


Kde vložíš breakpoint. Po prvním zastavení, až zpracuješ ten řádek

table_item[0] má obsahovat ty hodnoty, které byly iniciovány, konkrétně jsem inicioval

tables->radiation_insolation[0].num = 7;

takže (table_item[0]).num by mělo vrátit 7.
 

Nahlásit jako SPAM
IP: 78.102.61.–
KIIV
~ Moderátor
+42
God of flame
13. 8. 2017   #28
-
0
-

#27 oxidián
neco jako: 

   currentTableElementsNum = table_arrays[i]->num;
   printf("%d => %d\n", i, currentTableElementsNum);

a vypisuje to:

0 => 7
1 => 5
2 => 9
3 => 1
4 => 1
5 => 4
Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
13. 8. 2017   #29
-
0
-

Přesně, ale mě to nevypisuje tak jak tobě. Mě to vypisuje 0 => 2289584. Nevím proč

Nahlásit jako SPAM
IP: 78.102.61.–
BDS+2
Věrný člen
13. 8. 2017   #30
-
0
-

#29 oxidián nejspíš tam máš ještě něco jiného (nebo jinak), a to ti tam dělá bordel

Nahlásit jako SPAM
IP: 185.69.69.–
Visual Studio C/C#/C++
(pouze samouk)
KIIV
~ Moderátor
+42
God of flame
13. 8. 2017   #31
-
+1
-
Zajímavé

#29 oxidián
ja to poustel na te svoji upravene verzi (v prispevku #26), ne na tom cos poslal.

Ty tam mas na nekolika urovnich nesmysly a totalne pletes urovne pointeru.

// poporade:

TABLE_ *table_arrays[6];
// ...
readfiles(&tables, &table_arrays); // cekas TABLES* ale predavas pointer na pole pointeru na TABLE_. Ekvivalent je TABLE_ *** !!!!!  



void readfiles(TABLES * tables, TABLES * table_arrays) { // TABLES* je blbost
// ...


char * prepareBuffer(TABLES * tables, char * buf, TABLE_ * table_arrays) {
//...
        TABLE_ * table_item = &(table_arrays[i]); // na co proboha?
        currentTableElementsNum = (table_item[0]).num; // -> je myslim daleko lepsi
        printf("%d => %d\n", i, currentTableElementsNum);


Proste predavas trirozmerny pointer, realne potrebujes dvourozmerny, ale v prepareBuffer s nim pracujes jako s jednorozmernym (pomoci silenosti, nad kterou se musim i ja 5 minut zamejslet, co tim k***a autor mohl myslet).

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
13. 8. 2017   #32
-
0
-

#26 KIIV
Na tento příspěvek jsem zapomněl. Takže teď vidím kde jsem udělal ty chyby:

V main jsem deklaroval:

TABLES tables;
TABLE_ *table_arrays[6]; // pointer na pole typu TABLE_

ale v readfiles jsem deklaroval

void readfiles(TABLES * tables, TABLE_ * table_arrays) // pointer na strukturu typu TABLE_ nebo dokonce TABLES

a v prepareBuffer to samé.

Myslím tedy že toto si už budu pamatovat:

char * prepareBuffer(TABLES * tables, char * buf, TABLE_ * table_arrays[];

void readfiles(TABLES * tables, TABLE_ * table_arrays[]);

Toto:

for(i = 0; i<TABLE_TYPES_NUM; i++) // count of tables
    {
    TABLE_ * table_item = &(table_arrays[i]);
    currentTableElementsNum = (table_item[0]).num;
    printf("%d => %d\n", i, currentTableElementsNum);
    }

Na 3. řádku mělo být:

TABLE_ * table_item = table_arrays[i];
 

Tedy hlavní problém byl v té deklaraci typů v hlavičkách funkcí.

Ta šílenost v tom cyklu, nebyla až tak podstatná, protože jsem to table_arrays[i] testoval v kukátku. Podstatná chyba byl ten pointer na typ TABLE_ nebo TABLES a tím pádem jsem se nemohl dostat dál.

Dík za vyřešení.

Nahlásit jako SPAM
IP: 78.102.61.–
KIIV
~ Moderátor
+42
God of flame
14. 8. 2017   #33
-
+1
-
Zajímavé

TABLE_ *table_arrays[6]; // pointer na pole typu TABLE_

Na tohle bacha, veskutecnosti je to pole pointeru typu TABLE_! Trosku jasnejsi je, pokud bys to napsal jako:  TABLE_*  table_arrays[6]; (podle toho, co k cemu patri - table_arrays je pole o sesti prvcich a jejich typ je TABLE_*)

Pokud bys chtel pointer na pole, tak by deklarace vypadala takto:   TABLE_ (* table_arrays)[6];

Pak nezapomen na to, ze je rozdil mezi  &table_arrays a table_arrays. U pole sice ziskas stejny pointer, ale jineho typu!!!! Takze varianta s & (adress of) bude hazet warningy. Doufam, ze je mas zapnute vsechny, hned to upozornuje, kdyz to dela automaticke konverze z  ptr*** na ptr* a tak podobne.

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
14. 8. 2017   #34
-
0
-

Kompilátor do toho upozornění rovnou dává doporučení jak by to mělo vypadat?


test.c:75:35: warning: passing
argument 3 of ‘prepareBuffer’ from incompatible pointer type [-Wincompatible-pointer-types]
     prepareBuffer(tables, rowBuf, table_arrays);
 

Nahlásit jako SPAM
IP: 78.102.61.–
14. 8. 2017   #35
-
0
-

Nepíše řešení. Píše, co děláš špatně a tučně to zvýraznil.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+42
God of flame
14. 8. 2017   #36
-
0
-

#34 oxidián
Jestli je to to z prispevku #26, tak to bylo hlavne proto, zes tam mel  TABLES* table_arrays a ne  TABLE_* table_arrays[]. Dulezitejsi je ta poznamka k tomu:

test.c: In function ‘readfiles’:
test.c:75:35: warning: passing argument 3 of ‘prepareBuffer’ from incompatible pointer type [-Wincompatible-pointer-types]
     prepareBuffer(tables, rowBuf, table_arrays);
                                   ^
test.c:59:8: note: expected ‘TABLE_ * {aka struct <anonymous> *}’ but argument is of type ‘TABLES * {aka struct <anonymous> *}’
 char * prepareBuffer(TABLES * tables, char * buf, TABLE_ * table_arrays){
        ^
Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Expert
14. 8. 2017   #37
-
0
-

Mě to hlásilo trochu jinou hlášku a neměl jsem tam anonymní struct.

Nahlásit jako SPAM
IP: 78.102.61.–
KIIV
~ Moderátor
+42
God of flame
14. 8. 2017   #38
-
+1
-
Zajímavé

#37 oxidián
anonymous struct je jen proto, ze mas  

typedef struct {

kdybys mel:

typedef struct neco {

tak to bude zobrazovat nazev.

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 55 hostů

Podobná vlákna

Velikost pointeru — založil Pavelv

Vyznam pointeru — založil Alan

Inkrementace pointeru — založil Zelenáč

Moderátoři diskuze

 

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