Miért nem működik az alábbi program csillagok közti része?
#include <stdio.h>
#include <stdlib.h>
#include "csere.h"
typedef struct{
int oldal;
int meter;
char szin;
}utca;
typedef struct{
int pn_oldal;
int pn_meter;
char pn_szin;
}paratlan;
typedef struct{
int ps_oldal;
int ps_meter;
char ps_szin;
}paros;
int main()
{
paratlan * ptln;
paros * prs;
utca * kerites;
int foglal_feltolt(utca **k, int *m);
void listaz(utca *k, int m);
/*char tomb[6];*/
int i=0 ,meret=0;
foglal_feltolt(&kerites, &meret);
listaz(kerites, meret);
printf("\n2. feladat:\nAz eladott telkek szama %d\n",meret);
printf("\n3. feladat:\n");
//****************************************************************************************
for(i=1;i<=meret;i++){
if(kerites[i].oldal==1){
ptln[i].pn_oldal=kerites[i].oldal;
ptln[i].pn_meter=kerites[i].meter;
ptln[i].pn_szin=kerites[i].szin;
}
else{
prs[i].ps_oldal=kerites[i].oldal;
prs[i].ps_meter=kerites[i].meter;
prs[i].ps_szin=kerites[i].szin;
}
}
printf("\nparatlanok:\n");
for(i=1;i<=meret;i++){
printf("%d %d %c\n",ptln[i].pn_oldal, ptln[i].pn_meter, ptln[i].pn_szin);
}
printf("\nparosok:\n");
for(i=1;i<=meret;i++){
printf("%d %d %c\n",prs[i].ps_oldal, prs[i].ps_meter, prs[i].ps_szin);
}
//****************************************************************************************
}
int foglal_feltolt(utca **k, int *m){
FILE *fPointer=NULL;
fPointer=fopen("kerites.txt","r");
int i;
char c;
while((c=fgetc(fPointer))!=EOF){
if(c=='\n'){
(*m)++;
}
}
if(!(*k= (utca *)malloc((*m)*sizeof(utca)))){
return 1;
}
rewind(fPointer);
for(i=1;i<*m;i++){
fscanf(fPointer,"%d %d %c", &(*k)[i].oldal, &(*k)[i].meter, &(*k)[i].szin);
}
fclose(fPointer);
return 0;
}
void listaz(utca *k, int m){
int i;
for(i=1;i<=m-1;i++){
printf("%d %d %c",(k)[i].oldal, (k)[i].meter, (k)[i].szin);
printf("\n");
}
}
igen bocsi.
A beolvasott file-nak ilyen a felépítése:
1 20 X
0 23 F
0 12 A
0 45 B
0 11 R
1 10 :
1 6 #
1 23 Y
0 7 P
1 8 P
a csere.h meg még nincs használatban.
A debugger szerint ezzekkel a sorrokkal van a baj, csak nem tudom mi:
prs[i].ps_oldal=kerites[i].oldal
...
...
mondjuk a ptln-nek és a prs-nek nem látom, hogy bárhol is érték lenne adva.
egyébként ha lenne, akkor pedig majd a ciklusod i=meret eseten a kerites tömbből is túlcímez.
Na így máris jobb. Több probléma is van a kóddal, mondom sorban:
1. A legtöbb nyelvben (így a C-ben is) 0-tól(!) indexeljük a tömböket. Ha te lefoglalsz 10 elemnyi helyet egy tömbnek, akkor az a 0-9. indexet jelenti, te viszont rendre az 1-10 indexeket akartad hivatkozni. A program nem fog ezért külön sírni, de nem definiált működést fog eredményezni.
2. A ptln és prs tömböknek nem foglaltál memóriaterületet(malloc), és úgy próbáltad őket használni.
3. A ptln és prs tömböket nem folytonosan töltöd fel. Ugye 0-tól 9-ig fut az i változód a példainput esetében, és mindig a két tömb közül az egyiknek az i. indexére írsz adatot. Ez azt jelenti, hogy a másik tömb i. elemén memóriaszemét marad. Megoldás, külön int változókat felvenni ami azt méri, épp hány elemig vannak feltöltve az egyes tömbök, és azokat használni indexként. Így folytonosan tudod feltölteni a tömböket, és a visszaírásnál nem lesz probléma.
Feltöltöttem ide a kódod javított változatát, hogy át tudd nézni mik hogyan módosultak:
Nem tudom elmondani, hogy mennyire hálás vagyok!
A legjobban azt köszönöm, hogy úgy tudtad elmondani, hogy
1: Nem hülyéztél le
2: ÉRTETTEM MINDENT abból amit mondtál!
Kértem már segítséget pár helyen, de mindenhol jött a sok programozós szakszöveg ami tudom, hogy fontos, de nem nekem. Mármint most még biztos nem annyira.
Szóval nagyon szépen köszönöm.
Az az egy kérdésem lenne még, hogy miért nem mindegy, hogy mikor foglalom a helyet a változóknak?
Amikor kijavítottam a sajátomat akkor a helyfoglalást a printf-ek elé raktam és nem volt jó. Eltartott pár percig mire rájöttem, hogy azzal volt a baj, hogy nem jó helyen vannak deklarálva.
#7 A kódban amit küldtél egyáltalán nem volt memóriaterület foglalva annak a két változónak, amúgy lényegében véve mindegy mikor foglalod le, ha már tudod, mennyi helyre van szükség (mi az elemszám).
Oh igen, még ami eszembe jutott. A listaz és foglal_feltolt függvények deklarációja a main függvényen belül volt. Ez technikailag nem rossz, ez lényegében azt jelenti, hogy az adott függvények csak a main függvényben lesznek elérhetőek, viszont ez egy olyan praktika, amit nagyon, nagyon ritkán használnak a gyakorlatban, mert a legtöbb esetben semmi pozitívum nem származik belőle. A bevett szokás az, hogy az egyes függvényeket az adott fájl tetején deklaráljuk, és utána lejjebb írjuk meg a definícióját (magát a függvénytörzset). Vagy továbbvíve a dolgot, a függvények deklarációja egy külön .h header fájlban van, és a .c forrásfájlokba kerülnek a függvénydefiníciók.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!