Problem z odczytem z pliku ini i pętlą for

0

Witam ponownie. Mam kolejny problem z C++ WinApi.

TCHAR pozycje[80]="";
GetPrivateProfileString(TEXT("Plik"), TEXT("ile"), TEXT("blad"), pozycje, 80, TEXT(sNazwaPliku));  //wczytuje ilosc pozycji z pliku ini - np. 5
int ile;
ile = strtod(pozycje, NULL);
TCHAR* odczyt[ ile ];
int i;
for( i = 1; i <= ile; i++ )
{
char *j;
itoa(i, j, 50);
GetPrivateProfileString(TEXT("Plik"), TEXT(j), TEXT("blad"), odczyt[i], 80, TEXT(sNazwaPliku));  //odczytuje kazda pozycje po kolei i wczytuje je do tablicy
SetWindowText( hOpis, odczyt[3] );  //wyswietla jedna z pozycji dla testu np. 3
}

Powyższy kod niestety mi niedziała. Program się zawiesza. Chodzi o instrukcję GetPrivateProfileString gdyż jeżeli ją usunę wszystko jest w porządku. Czyżby znowu chodziło o typ zmiennych... Pomoże ktoś?

0

tutaj zerknij sobie jaki typ zwraca "strtod" i porównaj go z typem zmiennej "ile".
Zakładając, że w pętli chciałeś iterować sobie po tablicy odczyt i że w zmiennej "ile" chciałeś przechowywać ilość elementów tej tablicy to iterację masz źle. W c++ tablicę indeksuje się od 0 do ile - 1.
Tworzenie tablicy w ten sposób:

arekadiusz napisał(a):
int ile;
(...)
TCHAR* odczyt[ ile ];

Nie jest zalecane. W zasadzie to nie jest ono poprawne gdyż rozmiar tablicy tworzonej na stosie określany podczas jej deklaracji powinien być wyrażeniem stałym.

0

Rzeczywiście strtod zwraca double a nie int :(
Więc jak powinno wyglądać poprawne tworzenie tablicy w której chcę przechowywać słowa pobrane z pliku ini?

0

Cała zawartość mojego pliku: http://db.tt/WWmkfP9v
Będę bardzo wdzięczny za pomoc bo próbowałem już wielu sposobów i nie wiem co jest źle. :(

0

Drugi parametr funkcji GetPrivateProfileString(). Przekazujesz wskaźnik do nieokreślonego stringa (char *j;). Powinien zawierać nazwę klucza lub NULL.

0

No to właśnie numer przechowywany w zmiennej j jest kluczem w pliku ini. Załączyłem plik ini i wyraźnie jest tam pokazane jak wyglądają klucze.

0

W zmienne j niczego nie masz. Właściwie to program powinien paść na:
itoa(i, j, 50);
Ta funkcja oczekuje wskaźnika do istniejącego bufora (stringa), a przekazujesz wskażnik zawierający śmieciowy adres. 50 też nie jest w porządku powinno być 10.
I jeszcze jedno odczyt [i] jako parametr. Przekazujesz adres znaku w tablicy, a nie adres tablicy.

0

w funkcji itoa(int, char*, int) bufor, do którego zapisany będzie tekst musi być uprzednio zaalokowany.
Stwórz tablicę np. 10-cio elementową. Następnie w trzecim argumencie funkcji itoa() podajesz system pięćdziesiętny jako wyjście w tablicy znaków.
Wartości mogą być tam 2,8,10,16 (binarny, ósemkowy, dziesiętny, szescnastkowy).
Całość wyglądała by tak:

 
for( i = 1; i <= ile; i++ )
{
     char j[10];
     itoa(i, j, 10);
}

Następnie

 TCHAR* odczyt[ ile ];

.
Tworzysz tablicę wskaźników i nie alokujesz żadnej pamięci !
Poczytaj o alokacji i zwalnianiu pamięci. Jak na razie piszesz po nie swojej pamięci i dziwisz się, że ci się program wysypuje.

0

Przepraszam że tak długo nie odpowiadałem ale najpierw miałem wyjazd a jak wróciłem byłem bardzo zajęty. Teraz już wszystko jest w porządku i wracając do tematu:
Zrobiłem tak i dalej jest to samo - program się zawiesza. :(

int ile;
ile = strtod(pozycje, NULL);
TCHAR* odczyt[ ile ];
int i;
for( i = 1; i <= ile; i++ )
{
char j[10];
itoa(i, j, 10);
GetPrivateProfileString(TEXT("Plik"), TEXT(j), TEXT("blad"), odczyt[i], 80, TEXT(sNazwaPliku));
SetWindowText( hOpis, odczyt[3] );
}
0

W pętli for() wstaw za zmienną "ile" liczbę 0. Czy program ci się nie zapętli w nieskończoność? :D

 char* odczyt[ile]

Tworzysz tablicę wskaźników na tekst, ale nie alokujesz pamięci na ten tekst.
Zrób tak:

 
const int max_size = 80;

int ile = 0;
ile = (int) strtod(pozycje, NULL); 
char* odczyt[ile];
for(int n=0; n<ile; n++)
     odczyt[n] = (char*) malloc (max_size + 1); // alokujemy tyle miejsca ile maksymalnie wczytasz z pliku .INI
for( i = 0; i < ile; i++ )
{
     char j[10];
     itoa(i+1, j, 10);
     GetPrivateProfileString(TEXT("Plik"), TEXT(j), TEXT("blad"), odczyt[i], 80, TEXT(sNazwaPliku));
}

Potem nie zapomij zwolnić pamięci. http://pl.cppreference.com/w/cpp/memory/c/malloc

0

Teraz już wszystko działa!
Bardzo dziękuje!! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1