- bambano: Bambanő háza tája
- btz: Internet fejlesztés országosan!
- Luck Dragon: Asszociációs játék. :)
- weiss: Logi MX Master 3S FW NEM frissítés
- gban: Ingyen kellene, de tegnapra
- Geri Bátyó: Megint tahó voltam – SZEMÉLYISÉGFEJLŐDÉS
- Elektromos rásegítésű kerékpárok
- Argos: Adjátok vissza a netet! - szeretnék elaludni!
- sziku69: Fűzzük össze a szavakat :)
- MasterDeeJay: Alacsony fogyasztású házi szerver a korábbi projektekből összeépítve
Hirdetés
Új hozzászólás Aktív témák
-
Karma
félisten
válasz
PumpkinSeed #3899 üzenetére
Egy egyszerű megoldás, ha a koordináták azonnal léptetése előtt megnézed, hogy lehetséges-e az adott lépés (korlát, pályaszéle, akármi), és ha nem, akkor nem állítod be
-
PumpkinSeed
addikt
Azt, hogy az általam megrajzolt labirintus falára ne tudjon rámenni a játékos azt hogyan lehetne megcsinálni.
Nekem úgy sikerült, ha rá akar menni akkor visszadobja az elejére.Máshogy nem sikerült.
-
Geresics
addikt
válasz
dudika10 #3893 üzenetére
Tökéletes köszönöm!
Ráadásul már azt is értem, hogy miért nem volt jó eddig!Csupán annyit kellett átírnom, hogy a db=1-ről induljon, mert a szóközök száma mindig egyel kevesebb, mint a szavaké.
Még egyszer millió köszönet mindenkinek!
Szerk.:
Közben (#3894) tototos is megírta -
dudika10
veterán
válasz
Geresics #3889 üzenetére
#include <stdio.h>
#include <string.h>
void beolvas(char * szoveg)
{
printf("Adjon meg egy max. 70 karakter hosszu szoveget, majd usson ENTER-t!\n");
gets(szoveg);
return;
}
int szamlalas(char *szoveg)
{
int db=0;
int i=0;
while (szoveg[i]!='\0' && szoveg[i]!='.')
{
if (szoveg[i]==' ')
db++;
i++;
}
return db;
}
int main()
{
char szoveg[71];
int db;
beolvas(szoveg);
db=szamlalas(szoveg);
printf("A szoveg: %s, szavak szama: %d\n", szoveg, db);
return 0;
}Így jó.
A while ciklusod végtelenciklusba kerülne, nem logikai vagy, hanem és kapcsolat kell. Ha bármelyik megtörténik egyből ki kell lépni.
Láthatod azt is, hogy sztringet hogy kell átadni a függvénynek, és azt is, hogy a vissszatérési értéket hogyan kell használni.
Felhívnám a figyelmed az int db=0; és int i=0; sorokra. A deklarált változók memóriaszemetet tartalmaznak mindaddig, amíg értéket nem adsz nekik. Lehet, hogy az i-ben például a 2341 volt tárolva pont, és akkor úgy kezded, hogy a 71 lefoglalt bájtodból a 2341-ediket akarod olvasni, ahol lehet, hogy éppen az operációsrendszer dolgozik. Ezt nem szabad, ezért a fordító figyelmeztet, hogy adj értéket használat előtt.Remélem senki nem fogja leharapni ezért a fejem, de a BME VIK villamosmérnök hallgatók első féléves tárgya a C, és ebben a félévben nagyszerű diasort állítottak össze az oktatók.
[link]
Van gyakorlati anyag, elméleti anyag, rengeteg példa. -
tototos
addikt
válasz
Geresics #3889 üzenetére
na figyi, a szamlalas függvényed honnan tudja a beolvasott szöveget? attól mert ugyanazt a nevet használnod még az nem lesz ugyanaz, plusz a változóknak illik kezdőértéket adni
void beolvas(char* szoveg)
{
printf("Adjon meg egy max. 70 karakter hosszu szoveget, majd usson ENTER-t!\n");
gets(szoveg);
}
int szamlalas(char *szoveg)
{
int db [B]= 0[/B];
int i [B]= 0[/B];
while (szoveg[i]!='\0' || szoveg[i]!='.')
{
if (szoveg[i]=' ') db++; // ha nem használsz {} jeleket akkor érdemes egy sorba írni az if-fel
i++;
}
return db;
} -
Bobrooney
senior tag
válasz
tototos #3885 üzenetére
Függvényben a tömbök átadásánál, mindig a tömb kezdőcíme adódik át.
int szamlalas(char szoveg[], int db)
{
int i;
while (szoveg[i]!='\0' || szoveg[i]!='.')
{
if (szoveg[i]=' ')
db++;
i++;
}
}
int main()
{
char szoveg[71];
int db;
beolvas(szoveg);
szamlalas(szoveg, db);
printf("A szoveg: %s", szoveg);
return 0;
}
valahogy így kéne paraméterezni, nem futtattam le, de szerintem jó lesz! -
Geresics
addikt
válasz
tototos #3885 üzenetére
Most meg az "i"-re reklamál
Így fest jelenleg a kód, és kezdek megőrülni, mert azt írja, hogy "The variable 'i' is being used without being defined."void beolvas(char *szoveg[71])
{
printf("Adjon meg egy max. 70 karakter hosszu szoveget, majd usson ENTER-t!\n");
gets(szoveg);
}
int szamlalas()
{
char szoveg[71];
int db;
int i;
while (szoveg[i]!='\0' || szoveg[i]!='.')
{
if (szoveg[i]=' ')
db++;
i++;
}
}
int main()
{
char szoveg[71];
int db;
beolvas(szoveg);
szamlalas();
printf("A szoveg: %s", szoveg);
return 0;
} -
dudika10
veterán
válasz
Geresics #3886 üzenetére
(#3885) tototos: a kettő közül az egyik kell csak, persze.
A szöveg pointerként adódik át, mivel tömb neve [] nélkül mindig pointer.(#3886) geresics:Ha mutatót akarsz átadni, akkor (int *db) igen.
Viszont ekor a main-ben &db-t kell átadni.
int db;
Ekkor a db egy változó, &db a címe.
int * db;
Ekkor *db a változó, db a memóriacím.Ha int *db; -t írsz, akkor amikor értéket akarsz adni, akkor *db= ; kell.
Ha csak db= ; -t írnál, akkor a mutatót írnád át, és elveszítenéd az értéket.Amíg csak egy értéket akarsz visszaadni a függvénnyel, addig használd a visszatérési értéket. Ezt például a rekurzióhoz muszáj tudni kezelni, a rekurzió pedig gyakran ügyes kis trükk tud lenni.
(#3887) tototos: Ezzel nem is foglalkoztam még, de teljesen igazad van, kell neki a szöveg.
Globális változókról nekünk azt tanították, hogy amíg lehet kerüljük.(#3889) geresics : az i-nek adni kell egy kezdőértéket. Ha for ciklust használsz, akkor az for (i=0; ... értékadás is egyben. De mivel while ciklust használsz, ezért nincs ilyen értékadás, és az i jelenleg memóriaszemét.
A deklaráció után írj egy =0-t.
int i=0; -
dudika10
veterán
válasz
Geresics #3883 üzenetére
Egy függvény nem dolgozik a változóidon.
Másolatokat készít róluk.
Így ha a darab változódba beírod az 5-öt, és átadod egy függvénynek, akkor a függvény csinál ezzel valamit, átírja 6-ra, majd visszatér.
De mivel a függvény csak egy másolaton dolgozik, ezért a változóddal nem történik semmi.Erre találták ki a pointereket és/vagy globális változókat. Előbbit ajánlanám.
Pointerek segítségével átadhatod a memóriacímet, és így a függvény oda fogja írni.
Amíg csak 1 darab értéket kell módosítani a függvénynek, addig használhatod a visszatérési értékét.
Ha nem void ... a függvény, hanem int ... akkor a return darab; azt fogja eredményezni, hogy a darab értékét a függvény visszaadja.Pl.: int szamlalas ()
...
return db;
}és meghívásnál pedig:
db=szamlalas(db);Remélem érthető nagyjából és nem írtam semmi hülyeséget.
-
Geresics
addikt
Ismét szeretnék én is segítséget kérni, ugyanis továbbra is gondjaim vannak a külön függvényekkel... :S
/* Írja meg a tömb és sztring kezelő programokat olyan módon,
hogy a tömb vagy vektor a main függvényben legyen definiálva
és minden egyéb műveletet egy külön függvény tartalmazzon.
Például a beolvasás, keresés, számítás minegyik egy külön függvénybe kerüljön! */
/* Olvassunk be egy maximum 70 karakter hosszú mondatot.
Számoljuk meg, hogy hány szóból áll a mondat.
A szavakat a szóköz (' ') karakter választja el egymástól.
A mondat végén a pont ('.') karakter áll és ne vegyük figyelembe a pont utáni karaktereket */
#include <stdio.h>
#include <stdlib.h>
void beolvas(char szoveg[71])
{
printf("Adjon meg egy max. 70 karakter hosszu szoveget, majd usson ENTER-t!\n");
gets(szoveg);
}
void szamlalas (int db)
{
char szoveg[71];
int i;
while (szoveg[i]!='\0' || szoveg[i]!='.')
{
if (szoveg[i]=' ')
db++;
i++;
}
}
int main()
{
char szoveg[71];
int db;
beolvas(szoveg);
szamlalas(db);
printf("A szoveg: %s", szoveg);
return 0;
} -
Geresics
addikt
-
csicsaaa
tag
Akkor erre senki semmit?
-
Geresics
addikt
válasz
tototos #3859 üzenetére
sajnos a csere nem működik.
Próbafuttatáskor errorral kilép.
Megpróbáltam itt-ott átírni (pl. az általam korábban definiált változókra, stb.), de nem jutottam előrébb.
Jelenleg így fest a teljes kódom:/* Írja meg a tömb kezelő programot olyan módon,
hogy a tömb a main függvényben legyen definiálva
és minden egyéb műveletet egy külön függvény tartalmazzon.
Például a beolvasás, keresés, számítás mindegyik egy külön függvénybe kerüljön! */
/* Töltsünk fel egy 5x5-es integer mátrixot futási időben!
Ezután olvassunk be még két egész számot 0 és 4 között.
Végül a program cserélje fel a két egész számmal megadott oszlop elemeit.
Nyomtassuk ki az eredményt. */
#include <stdio.h>
#include <stdlib.h>
void beolvas(int array[5][5])
{
int i,j;
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("Soron kovetkezo elem: ");
scanf("%d", &array[i][j]);
}
}
}
void csere(int a[5][5])
{
int j; /* j a sorokat jelöli */
int szam1, szam2;
int mem=0;
for(j=0;j<5;j++)
{
mem=a[j][szam1-1];
a[j][szam1-1]=a[j][szam2-1];
a[j][szam2-1]=mem;
}
}
void nyomtatas(int a[5][5])
{
int i, j; /* i lesz az oszlop száma */
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("\nA(z) %d oszlop %d. eleme: [%d]", i+1, j+1, a[j][i]);
}
}
}
int main()
{
int a[5][5];
int i, j; /* i lesz az oszlop száma */
int szam1, szam2;
int mem=0;
/* beolvasás */
printf("\nAdja meg az 5x5-os tomb elemeit! Minden elem utan usson ENTER-t!\n");
beolvas(a);
/* két szám beolvasása */
printf("\nAdjon meg egy szamot 0 es 4 kozott: ");
scanf("%d", &szam1);
printf("Adjon meg egy masik szamot 0 es 4 kozott: ");
scanf("%d", &szam2);
/* csere */
csere(a);
/* nyomtatás */
nyomtatas(a);
return 0;
}Megpróbáltam azt is, hogy a két szám beolvasását beleraktam a "csere" függvénybe, de nem segített...
-
Davs
tag
válasz
Geresics #3856 üzenetére
Hmm a beolvas fuggveny parameterevel nincs gond? Marmint az nem tetszik, hogy a parameter se nem globalis tomb, se nem pointer egy lokalis tombre. Tehat a beolvas fuggveny meghivasanal, letrejon egy [5][5]-os LOKALIS (funkcio szinten) tomb, ami azutan nem marad meg, miutan kilep a funkcio (Ugyebar a memoria maga nem torlodik, szoval ha a beolvas es a nyomtatas fuggvenyek activation record-ja (nemtudom mi a magyar forditasa) megegyezik, akkor elvileg mukodhet, de nemhiszem, hogy egy alapszintu hazinal ezt joszemmel neznek).
Egy szo mint szaz, en egy 2D tombre mutato pointert adnek meg a beolvas fuggveny parameterekent. VAGY valamit NAGYON felreneztem, azesetben pedig kernek valakit, hogy mielobb rakjon helyrekoszi
-
tototos
addikt
válasz
Geresics #3856 üzenetére
Attól hogy a függvény paraméterben is a-nak nevezed még nem fogsz arra hivatkozni. Amikor meghívod a beolvas(a) függvényt akkor fogja az array-t az a-ra állítani.
a csere meg kb így néz ki:
void csere(int a[5][5], int oszlop1, int oszlop2)
{
int i; //sorokat jelöli
int temp = 0;
for(i=0;i<5;i++)
{
temp = a[i][oszlop1 - 1];
a[i][oszlop1 - 1] = a[i][oszlop2 - 1];
a[i][oszlop2 - 1] = temp;
}
} -
Geresics
addikt
válasz
tototos #3855 üzenetére
Istenkirály vagy!
Ez alapján kezdem kapizsgálni a lényeget, meg is csináltam gyorsan a nyomtat függvényt is!
Már csak erre a fránya oszlopcserére kell rájönnöm, és mehetek is a másik feladatra!
Tényleg, az int array[5][5] miért van? Mert az én értelmezésemben (ahogy a nyomtatban csináltam) az "a" nevű 5x5-ös mátrixra hivatkozom. Vagy rosszul értelmezek valamit?#include <stdio.h>
void beolvas(int array[5][5])
{
int i,j;
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("Soron kovetkezo elem: ");
scanf("%d", &array[i][j]);
}
}
}
void nyomtatas(int a[5][5])
{
int i, j; /* i lesz az oszlop száma */
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("\nA(z) %d oszlop %d. eleme: [%d]", i+1, j+1, a[j][i]);
}
}
}
int main()
{
int a[5][5];
int i, j; /* i lesz az oszlop száma */
int szam1, szam2, mem;
/* beolvasás */
printf("\nAdja meg az 5x5-os tomb elemeit! Minden elem utan usson ENTER-t!\n");
beolvas(a);
/* nyomtatás */
nyomtatas(a);
return 0;
} -
tototos
addikt
válasz
Geresics #3854 üzenetére
akkor kell csinálnod egy beolvas függvényt
void beolvas(int array[5][5])
{
int i,j;
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("Soron kovetkezo elem: ");
scanf("%d", &array[i][j]);
}
}
}
ez pedig a main:
int main()
{
int a[5][5];
int i, j; /* i lesz az oszlop száma */
int szam1, szam2, mem;
/* beolvasás */
printf("\nAdja meg az 5x5-os tomb elemeit! Minden elem utan usson ENTER-t!\n");
beolvas(a);
return 0;
} -
Geresics
addikt
-
Geresics
addikt
Hali!
Kicsit későn állok neki a Prog I. háziknak, ezért szükségem lenne egy kis segítségre!
A tömb feltöltését és kinyomtatását már megcsináltam, de az oszlopok felcserélése még hátravan.
A nagyobb problémám az, hogy hogy csinálok különálló függvényeket?/* Írja meg a tömb kezelő programot olyan módon,
hogy a tömb a main függvényben legyen definiálva
és minden egyéb műveletet egy külön függvény tartalmazzon.
Például a beolvasás, keresés, számítás mindegyik egy külön függvénybe kerüljön! *//* Töltsünk fel egy 5x5-es integer mátrixot futási időben!
Ezután olvassunk be még két egész számot 0 és 4 között.
Végül a program cserélje fel a két egész számmal megadott oszlop elemeit.
Nyomtassuk ki az eredményt. */#include <stdio.h>
#include <stdlib.h>
void main()
{
int a[5][5];
int i, j; /* i lesz az oszlop száma */
int szam1, szam2, mem;
/* beolvasás */
printf("\nAdja meg az 5x5-os tomb elemeit! Minden elem utan usson ENTER-t!\n");
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("Soron kovetkezo elem: ");
scanf("%d", &a[i][j]);
}
}
/* két szám beolvasása */
printf("\nAdjon meg egy szamot 0 es 4 kozott: ");
scanf("%d", &szam1);
printf("Adjon meg egy masik szamot 0 es 4 kozott: ");
scanf("%d", &szam2);
/* két oszlop megcserélése */
/* a következő algoritmust találtam ki, de még nem írtam meg:
a[0][szam1]=mem;
a[0][szam2]=a[0][szam1];
mem=a[0][szam2];
mem=0;
*/
/* nyomtatás */
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("\nA(z) %d oszlop %d. eleme: [%d]", i+1, j+1, a[j][i]);
}
}
} -
csicsaaa
tag
Sziasztok!
Tudnátok segíteni abban hogy szinte a nulláról vagyok de egy olyan házit kellene csinálniami két tömbe, egy A és B-be kér be egy-egy nevet max 30karaktert, és enterre befejezi a bekérést.
Nagy köszönet érte ha valaki szán rá időt -
Karma
félisten
válasz
tototos #3847 üzenetére
A válasz meg még mindig az, hogy írj egy
uint16_t signal_get_id(const signal_struct const* signal)
{
return signal->id;
}függényt a signal.c-be, és a struktúra tagdefinícióját is átrakod oda. A headerben meg csak a forward deklarációk maradnak, így ha a headert használja valaki, nem tudja még a tagok offszetjét ye, ergo nem tudja változtatni.
-
tototos
addikt
Sziasztok!
A múltkori struktúrás kérdésemre kapott válaszokat köszönöm. Sajnos valamiért nem akart összejönni a dolog, így kicsit módosítottam a dolgokon.
Adott egy .c fájl amiben megvalósítom a meghívható get_Signal függvényt
ennek a paramétere egy struktúrára mutató pointer, amiben át kell adnom egy lokálisan tárolt struktúrát, aminek az értékeit csak egyszer adom meg és onnantól ne lehessen módosítanisignal.h:
typedef struct{
Signal_Types name;
uint16_t id;
uint8_t pos;
uint8_t length;
uint8_t order;
float factor;
float offset;
}Signal_TypeDef;
signal.c
static Signal_TypeDef SIGNALS[9];
uint8_t CAN_Signal_Init()
{
SIGNALS[NEW_SIGNAL_12].name = NEW_SIGNAL_12__NAME;
SIGNALS[NEW_SIGNAL_12].id = NEW_SIGNAL_12__ID;
SIGNALS[NEW_SIGNAL_12].pos = NEW_SIGNAL_12__POS;
SIGNALS[NEW_SIGNAL_12].length = NEW_SIGNAL_12__LENGTH;
SIGNALS[NEW_SIGNAL_12].order = NEW_SIGNAL_12__ORDER;
SIGNALS[NEW_SIGNAL_12].factor = NEW_SIGNAL_12__FACTOR;
SIGNALS[NEW_SIGNAL_12].offset = NEW_SIGNAL_12__OFFSET;
...
}
uint8_t get_Signal(SignalName name, Signal_struct** signal)
{
*signal = &SIGNALS[name];
}
main.c:
Signal_Struct* signal;
get_Signal(NWE_SIGNAL_12, &signal);
signal->id = 0x200; //ez ne tudjon lefutni vagy jelezzen a fordító hibátAz utolsó sort kellene valahogy megoldanom, hogy ne tudjak a struktúrába módosítani.
-
Karma
félisten
válasz
PumpkinSeed #3845 üzenetére
Noshát. A game loop nagyon leegyszerűsítve egy végtelen ciklus, ami addig tart, ameddig a játéknak nincs vége. A ciklusmagban pár dolgot kell elvégezned kötötten:
1) Fogadnod kell a felhasználótól a bemenetet. Ez lehet polling jellegű (amikor ideérsz, megnézed milyen gombok vannak lenyomva), vagy eseményalapú, de az előbbi egyszerűbb.
2) Frissítened kell a szereplők állapotát egy lépéssel (folyamatos idejű játéknál egy valamekkora időszelettel). Ehhez felhasználod az előzőleg begyűjtött inputot, meg az esetleges AI döntéseket.
3) Frissíted a világ állapotát, azaz kezeled az ütközéseket, halálokat, születéseket.
4) (legegyszerűbb eset) Újra kell rajzolnod a képernyőt.
5) Be kell aludnod párszáz milliszekundumra.Ezt kell ismételgetned.
Az SDL, Allegro és társai mind ehhez adnak alapot. -
Karma
félisten
válasz
PumpkinSeed #3843 üzenetére
Mi a kérdés? A kígyó mozgása konkrétan (azaz hogyan tárold a kanyarodásokat), vagy maga a folyamatos léptetés (game loop)?
-
PumpkinSeed
addikt
Azt hogyan csinálom meg, hogy egy test folyamatsan mozogjon mint pl. egy snake játékban. Ha kérhetném csak a mozgásban adjatok segítséget a többit magamtól szeretném
-
buherton
őstag
válasz
Jester01 #3838 üzenetére
Nem jogos, ha a C99 szabványt vesszük alapul, mert a 37. oldal 16 sorától:
The type signed char was introduced in C89 to make available a one-byte signed integer type on those systems which implement plain char as unsigned char. For reasons of symmetry, the keyword signed is allowed as part of the type name of other integer types. Two varieties of the integer types are specified: signed and unsigned. If neither specifier is used, signed is assumed.
-
buherton
őstag
válasz
PumpkinSeed #3835 üzenetére
Tudtommal nem igazán, csak nagyoltan, hogy ha 0 - 255 kell, akkor unsigned char, ha -128 - 127-ig akkor char stb...
-
Davs
tag
válasz
PumpkinSeed #3835 üzenetére
max ugy, hogy pl egy fuggveny segitsegevel allitod be az erteket, amiben ellenorzod, hogy a megadott intervallumban van-e az ertek..
int x ;
void setVar(int y) {
if(5<y && y<10)
x=y ;
}
void main() {
setVar(6) ;
} -
PumpkinSeed
addikt
Változónak, lehet minimum és maximum értéket adni, és ha lehet akkor hogyan?
-
Vasinger!
nagyúr
Ez igaz, ez tényleg nem jó módszer, mert valóban túlindexelheti, persze azt nem tettem hozzá hogy csak ideális esetet nézzünk. Tehát mindenkinek ilyen alakú a neve: Szabó János Tehát is az első szóköz után kell nagybetűsíteni.
Arra gondoltam én is, hogy minden stringet nagybetűsíteni talán könnyebb, de akkor hogyan csinálok kisbetűt belőlük utána ami nem kell?
Az oké, hogy azt a megoldást kell használni 0-tól különböző helyre is, de nem tudom az indexet, hogy hol kéne használni.
-
Karma
félisten
válasz
Vasinger! #3832 üzenetére
Hátde az első sorban megírtad a megoldást, miért nem használod ugyanezt a szintaktikát a nullától különböző indexre?
Egyébként halálfejesen rossz megoldás, mert túlindexeléssel reccsen, ha a string végén szóköz van. Miért nem touppereled meg az egész stringet rendezésnél? Megspórolod a szóközkereső mágiát.
Másrészről viszont az ékezetes karakterekkel csak a baj van. Ezt a problémát már sokszor megoldották a világban, úgy nevezik, hogy collation.
-
Vasinger!
nagyúr
Lenne egy fontos kérdésem:
Van egy rendező függvényem, ami ABC sorrendbe rendezi egy láncolt lista elemeit strcmp stringkezelő függvénnyel.
Viszont ezzel az a baj, hogy a kis és nagy betűket és az ékezetes betűkkel hadilábon áll.
Tehát a nagybetűseket előreveszi, utána jönnek a kisbetűsök névsorrendbe és utána a az ékezetes betűvel kezdődőek.
Ezt hogy lehetne valahogy kijavítani?
A kis és nagybetűs dolgon már dolgozok. A bekért név első betűit nagybetűsítem, így nem lesz belőle baj, de egyelőre még csak az első karaktert tudtam nagybetűsíteni, a szóköz után nem.
Itt mi lehet a baj?uj->nev[0] = toupper(uj->nev[0]);
char *hely= strchr(uj->nev, ' ');
toupper(hely+1);Az utolsó sor tudom, hogy nem jó, csak igazából a memóriacímét adja vissza, nem pedig a a sztring valahányadik karakterét. :\
Előre is köszi!
-
Jester01
veterán
Az fgets már eleve rajta hagyja a sorvéget, te meg még plusz teszel is ... ehhez képest ha egy sincs az valami mágia:
$ cat >test.c
#include <stdio.h>
void csinal_dat()
{
char puff[256];
FILE *fpt=fopen("kons.txt","rt");
FILE *fpd=fopen("kons.dat","wb");
if (fpt!=NULL)
{
while(fgets(puff,256,fpt)!=NULL)
{
fprintf(fpd,"%s\n",puff);
}
}
else
printf("hibas megnyitas: kons.txt");
fclose(fpd);
fclose(fpt);
}
int main()
{
csinal_dat();
return 0;
}
$ gcc -g test.c
$ echo -e "alma\nnarancs" > kons.txt
$ cat kons.txt
alma
narancs
$ ./a.out
$ cat kons.dat
alma
narancs -
aAron_
őstag
válasz
Jester01 #3828 üzenetére
mintha ott se lenne, én sem értem...
kons.txt:
alma
narancsde a kons.dat-ba csak ezt íja:
almanarancs
a teljes kód így néz ki:
void csinal_dat()
{
char puff[256];
FILE *fpt=fopen("kons.txt","rt");
FILE *fpd=fopen("kons.dat","wb");
if (fpt!=NULL)
{
while(fgets(puff,256,fpt)!=NULL)
{
fprintf(fpd,"%s\n",puff);
}
}
else
printf("hibas megnyitas: kons.txt");
fclose(fpd);
fclose(fpt);
} -
aAron_
őstag
egy gyors kérdésem lenne, bináris fájlba íráskor hogyan tudok sort törni?
fprintf(fp,"%s\n",pff); nem működik, neten nem találtam rendes, egyszerű megoldást
-
tototos
addikt
válasz
buherton #3824 üzenetére
És olyat nem lehet hogy ne a fv visszatérési értéke legyen a változó?
ilyenre gondolok:
valami.c:
fooTypeDef localfoo;
void set(const fooTypeDef * const foo)
{
foo.ifoo=0; //ez csak egyszer hívódik meg
}
void get(const fooTypeDef ** const foo)
{
localfoo.cfoo = a+b; //ez az értékadás minden hívásnál megtörténik
*foo= &localfoo;
}
main.c //ezt hívják majd a fejlesztők
footypedef* myfoo;
get(&myfoo);
myfoo->ifoo = 5; //erre vagy hiba vagy ne hajtódjon végre
myfoo->cfoo = 4; // ez annyira nem nagy hiba mert a legközelebbi hívásnál úgyis felülíródik -
buherton
őstag
válasz
buherton #3824 üzenetére
Ami kimaradt: így a get függvények belül egyik adattagot sem lehet írni, csak és kizárólag olavsni. Az set-get-es függvényeknek azaz előnyük, hogy szabadon lehet változtatni az összes adattagját, viszont get a függvénnyel egyesével tudsz értékeket olvasni. Kivéve ha nem kókányolsz íly módon:
#include <stdlib.h>
#include <stdio.h>typedef struct
{
int ifoo;
char cfoo;
} fooTypeDef;int get(const fooTypeDef * const foo, int * const ibar, char * const cbar)
{
*ibar = sfoo->ifoo;
*cbar = sfoo->cfoo;
}int main(void)
{
fooTypeDef sfoo;sfoo.ifoo = 10;
sfoo.cfoo = 'a';int ibar;
char cbar;get(&sfoo, &ibar, &cbar);
printf("%i %c", ibar, cbar);return 0;
}Vagy valami ilyesmi lesz.
-
buherton
őstag
válasz
tototos #3823 üzenetére
Olyat lehet csinálni, hogy senki nem írhat a struktúrába.
#include <stdlib.h>
#include <stdio.h>
typedef struct
{
int ifoo;
char cfoo;
} fooTypeDef;
int get(const fooTypeDef * const foo)
{
int i = sfoo->ifoo; //működnie kellene, ha csak ez van a függvény törzsben
sfoo->cfoo = 'd'; // erre viszont hibát kell, hogy dobjon, mert konstans változóba nem lehet írni
}
int main(void)
{
fooTypeDef sfoo;
sfoo.ifoo = 10;
sfoo.cfoo = 'a';
get(&sfoo);
return 0;
}Nincs nálam fordító, így nem tudom kirpróbálni, hogy tényleg működik-e.
Fene a jó dolgod. Szívesen foglalkoznék főállásban ilyennel, csak sajnos más fele vitt a sors. Most is körülöttem ilyennel foglalkoznak csak én más projekten vagyok.
-
tototos
addikt
válasz
buherton #3819 üzenetére
Köszi szépen. Délután kipróbálom a dolgot.
MCU-ra írom, egy kommunikációs modul kiegészítése lesz. Azért használok pointert hogy csak egyszer legyen tárolva a struktúra, és azt lehessen átadni. Sajnos ahogy néztem, az egész struktúrát nem tudom átadni, csak egyenként az elemeket. Az lett volna jó ha tudok egy get függvényt írni ami visszaadja a struktúrát és ha valaki a struktúra elemét akarja átírni akkor beszól a fordító, vagy csak egyszerűen nem történik meg a művelet futás közben. -
Jester01
veterán
Ha megoldható, akkor a tömböt add át, és a függvényen belül legyen a .adatx. Ez gondolom menne, tehát valamiért nem megvalósítható.
Alternatívaként csinálhatsz accessor függvényt, varázsolhatsz offsetof segítségével avagy ha esetleg véletlen c++ és nem c akkor member pointerrel.
#include <iostream>
using namespace std;
struct Foo
{
int x;
int y;
};
int sum0_x(Foo* array, int count)
{
int r = 0;
for(int i = 0; i < count; i += 1)
{
r += array[i].x;
}
return r;
}
int sum0_y(Foo* array, int count)
{
int r = 0;
for(int i = 0; i < count; i += 1)
{
r += array[i].y;
}
return r;
}
int sum1(Foo* array, int count, int (*accessor)(Foo*))
{
int r = 0;
for(int i = 0; i < count; i += 1)
{
r += accessor(array + i);
}
return r;
}
int sum2(Foo* array, int count, int member)
{
int r = 0;
for(int i = 0; i < count; i += 1)
{
r += *(int*)((char*)(array + i) + member);
}
return r;
}
int sum3(Foo* array, int count, int (Foo::*member))
{
int r = 0;
for(int i = 0; i < count; i += 1)
{
r += array[i].*member;
}
return r;
}
int accessor_x(Foo* foo)
{
return foo->x;
}
int accessor_y(Foo* foo)
{
return foo->y;
}
int main()
{
Foo foos[2];
foos[0].x = 1;
foos[0].y = 2;
foos[1].x = 3;
foos[1].y = 4;
cout << "sum0(x) = " << sum0_x(foos, 2) << endl;
cout << "sum0(y) = " << sum0_y(foos, 2) << endl;
cout << "sum1(x) = " << sum1(foos, 2, accessor_x) << endl;
cout << "sum1(y) = " << sum1(foos, 2, accessor_y) << endl;
cout << "sum2(x) = " << sum2(foos, 2, offsetof(Foo, x)) << endl;
cout << "sum2(y) = " << sum2(foos, 2, offsetof(Foo, y)) << endl;
cout << "sum3(x) = " << sum3(foos, 2, &Foo::x) << endl;
cout << "sum3(y) = " << sum3(foos, 2, &Foo::y) << endl;
return 0;
} -
Sleed
aktív tag
Sziasztok!
Van egy 9 elemű tömböm(a neve legyen tomb), amiben struktúrákat(a typedefelt neve legyen struktura) tárolok ezekben pedig stringet,double-t, int-et(rendre legyenek adat1, adat2, adat3).
Az lenne a kérdésem, hogy hogyan tudnám az adat1-2-3-at különböző függvényeknek úgy átadni, hogy a tömb indexére bevezethessek egy ciklusváltozót és a függvényen beül egy ciklusban az adott műveletet minden tömb struktúrájának adataira elvégezhessem?
Remélem sikerült érthetően megfogalmaznom
Az egyes adatokra ugye úgy tudok hivatkozni, hogy tomb[ciklusvált].adatx, de ezt függvénynek még nem nagyon sikerült úgy átadni, hogy szeresse, és az i-t léptetni is tudjam.
köszi,
SleeD -
buherton
őstag
válasz
tototos #3814 üzenetére
Röviden ennyi a set-get. Nem működik teljesen jól, de az elv jól látszódik. Mivel úgy írtad, hogy a sokból két változó nem változhat, így a const-os dolgot nem lehet használni, mert akkor egyik elemét sem lehet változtatni. Valamiért nem a 10-t tölti bele a változóba. Tudja esetleg valaki, hogy miért?
#include <stdlib.h>
#include <stdio.h>
typedef struct
{
int ifoo;
char cfoo;
} fooTypeDef;
void set(fooTypeDef foo)
{
foo.ifoo = 10;
}
int get(const fooTypeDef foo)
{
return foo.ifoo;
}
int main(void)
{
fooTypeDef sfoo;
set(sfoo);
printf("%i\n", get(sfoo));
return 0;
}Látom pointereket használsz. Ha azok sem változnak, akkor arra is ki lehet kötni, hogy konstans legyen.
MCU-ra vagy a PC-re írod a kódod?
Bocsi, hogy csak most válaszolok, de a munkahelyen nem szeretek 1-2 percnél többet foglalkozni a fórummal.
-
Vasinger!
nagyúr
Kéne egy kis segítség a programomban. Ez az egy hiba van már csak benne, de nem jövök rá miért.
Egy telefonkönyves program menüvel a feladat, ez a részlet pedig az egyik függvény, amelyet egy menüből hívok meg.
Igazából az történik, hogyha van elem a listába, akkor az első if ugye nem teljesül, mert lista != NULL pointerrel, azzal nincs is baj. Akkor ugye belép az else ágba. Kiírja szépen az elemeket. Bekéri, hogy melyiket szeretném törölni. Nos itt jön egy feltételvizsgálat ami kiakaszt. Azt nézem meg, hogy számot fog e bekérni, mert ha a scanf függvény egyenlő 0-val(aminek az értékét egy valami változóba tettem be), akkor nem számot írt be a felhasználó, tehát akkor belép a feltételbe.
És most jön a lényeg!! Ugyebár azt kéne csinálnia, hogy kiírja az szöveget és egy karaktert kéne várni a felhasználótól, majd visszatér 0-val. De nem ezt csinálja. Ha nem számot írok be, akkor viszalép egyből a főmenübe, persze felvillan a kiírás, de a getcharok nem állítják meg a programot. Tehát valahonnan kap karaktert a getchar. Ez hogy lehet? Honnan kaphat? Hogy lehetne kijavítani?Nagyon fontos és sürgős lenne!
Előre is köszi!
A kódrészlet:
Adatok*torol(Adatok*lista)
{
int t=0,valami=0,i;
Adatok*mozgo, *lemarado;
if (lista==NULL){
printf("A lista nem tartalmaz elemeket!\n");
printf ("\nA visszalépéshez kérem nyomjon le egy billentyűt!\n");
getchar();
return 0;
}
else{
listakiiras(lista, 1); // Ez csak kilistázza egy for ciklussal printeffelve a lista elemeit.
printf("\nMelyik bejegyzést szeretnéd törölni?\n");
valami=scanf("%d", &t);
if (valami==0){
getchar();
printf("\nÉrvénytelen válasz.\n\nKérem nyomjon le egy billentyűt a visszalépéshez!\n");
getchar();
return 0;
}
else{ stb. bla bla -
tototos
addikt
válasz
buherton #3813 üzenetére
Kicsit vázolom a helyzetet, hogy most mi van készen.
.h fájl:
typedef struct{
Signal_Types name;
uint16_t id;
uint8_t pos;
uint8_t length;
uint8_t order;
float factor;
float offset;
uint16_t binValue;
float realValue;
}Signal_TypeDef;
Ezek közül a binValue és realValue-n kívül mindegyik csak egyszer kap értéket..c fájl:
static Signal_TypeDef SIGNALS[9];
uint8_t CAN_Signal_Init()
{ /*Itt kap értéket a struktúra tömb */}
uint8_t get_Signal(Signal_struct** signal)
{ /*Ezt a függvényt hívják meg a fejlesztők hogy megkapják a signal struktúrát */} -
buherton
őstag
válasz
tototos #3812 üzenetére
Igen. Tulajdonképpen objektum orientáltan kell programozni C-ben, és ezt valahogy így tudod megoldani, hogy kávzi a struktúra az objektum paramétere, és a get/set függvény a metódusa.
De van egymásik lehetőség is, ami C-seb. Ha függvényekkel dolgozol, akkor amikor átadod a struktúrát, akkor const-ként kell átadni, mert nem akarod, hogy változtatva legyen (pointernél olyat is lehet csinálni, hogy a stuktúra címét ne lehessen változtatni). Így, mivel konstansként akarod használni a függvényen belül, és ne talán tán megváltoztatod az egyik értéket, akkor arra a fordító hibát fog dobni.
-
Karma
félisten
válasz
tototos #3810 üzenetére
Persze hogy van, csak egy kicsit el kell rugaszkodnod a struktúrától. A megoldás az ún. getter/setter függvények írása, amivel szabályozod a hozzáférést.
Röviden írnod kell olyan függvényeket, melyeknek az első paramétere egy pointer a struktúratípusodra; a getternél nincs más, a setternél meg ott az új érték másodiknak. És csak ezeket a függvényeket használod a struktúrád birizgálásához, közvetlenül nem nyúlsz bele.
C-ben ezt egyébként elég könnyen garantálni is tudod, ha a struktúrád definícióját külön .c fájlba rakod.
-
tototos
addikt
Sziasztok!
Egy kis segítségre lenne szükségem C-s téren.
Adott egy struktúrám, amiben van mindenféle változó. Azt szeretném hogy ezeknek a változóknak csak egyszer lehessen értéket adni, és utána ne lehessen megváltoztatni.
A dolog érdekessége hogy a struktúrából létrehozok egy tömböt és egy függvényen belül adok értéket a struktúrák elemeinek. Ha az elemeket const-al deklarálom akkor beszól a fordító hogy read-only value.
Van valami megoldás erre a problémára?Köszi a segítséget
-
artiny
őstag
válasz
kingabo #3808 üzenetére
Ez már olvastam
de az elején még teccet,hogy nem definiciókként írja le a dolgokat. Csak a kozepe fele már elvesztem a szovegben. Masodszor is nekifutottam akkor már szinte mindent értettem. De a végén nem tudtam ossze hozni a programot. (chat programnál én is olvastam már egyszer ezeleott
)
-
kingabo
őstag
Ebben a témában erősen ajánlom Brian "Beej" Hall cikkét: magyar változat, angol több formátumban. (ez alapján írtam "chat" szervert minden benne van)
-
artiny
őstag
válasz
Jester01 #3806 üzenetére
A cliens kuld valamit a servernek , a server tovabb kuldi egy masik kliensenk ami a kerest vegre hajtja majd vissza kuldi a szerver a kapott eredmenyt. (összeadást , pl. 1 + 1)
Ezen az oldalon van egy server-kliens
http://www.prasannatech.net/2008/07/socket-programming-tutorial.html
C tipusu
tcpserver.c
tcpcliens.c
Ezeket lefutattam,mukodnek (szoveget tudok kuldeni ide oda. Ubuntu alatt teszteltem) -
-
artiny
őstag
Szerver kliens programkodja van valkinek?
C ben irt szerver kliens program amiben tobb kliens egy szerverrel komunikál.(egyszeru komunikacio . szoveg vagy számolás
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Samsung Galaxy S9+ 64GB, Kártyafüggetlen, 1 Év Garanciával
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RTX 5070 Ti 16GB GAMER P termékbeszámítással
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7700X 32/64GB RAM RTX 5070 Ti 16GB GAMER PC termékbeszámítással
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RX 9070 16GB GAMER PC termékbeszámítással
- Eladó szép állapotban levő Lenovo Tab M8HD 3/32GB / 12 hó jótállással / gyári tartozékokkal
- Bomba ár! HP EliteBook Folio 1040 G2 - i5-G5 I 8GB I 256GB SSD I 14" HD+ I Cam I W10 I Garancia!
- BESZÁMÍTÁS! Intel Core i9 9900K 8 mag 16 szál processzor garanciával hibátlan működéssel
- Telefon felvásárlás!! iPhone 11/iPhone 11 Pro/iPhone 11 Pro Max
- DELL Precision 7730 i5-8400H Quadro P3200 32GB 1000GB FHD 17 1 év garancia
- Dell USB-C, Thunderbolt 3, TB3, TB4 dokkolók (K20A) WD19TB/ WD19TBS/ WD22TB4, (K16A) TB16/ TB18DC
Állásajánlatok
Cég: FOTC
Város: Budapest