GNU-c segitseg kellene

GNU-c segitseg kellene
2012-01-22T16:12:20+01:00
2012-01-22T19:11:09+01:00
2022-11-24T10:50:40+01:00
kako
Hello mindenki!

Egy problema kapcsan kellene egy kicsit C-ben programoznom. Elorevetitem, hogy meg sose foglalkoztam c-vel, csak basic, pascal, php, ugyhogy legyetek legyszi kimeletesek!

Harom nem tul bonyolult fuggvenyt kellene atirnom. Az elso az sikerult elso nekifutasra, de a masodikkal mar masodik napja gorcsolok. Mar-mar ugy nezett ki, hogy sikerul, de
1, forditasnal warningol a gcc:

[root@kako cip]# gcc test4.c -o test4 test4.c: In function ‘titkosit’: test4.c:28:4: warning: return makes integer from pointer without a cast [enabled by default]

2, core dump -ot dob futtataskor


A forras ennyi:

#include <stdio.h> #include <string.h> #include <stdlib.h> main() { char result; char titkosit( char instr[], char pwstr[], long len ) { int j, pwlen, passnum; long i; char buff[1]; pwlen = strlen( pwstr ); passnum = 79; for ( i = j = 0; i < len; i++ ) { passnum = (int) (((passnum + ( i - len )) - 1 ) % 254) + 1; buff[0] = (instr[i] ^ (passnum ^ pwstr[j]) ); instr[i] = (buff[0] ? buff[0] : instr[i]); j = ( j >= pwlen ? 0 : j++ ); } return(instr); } result = titkosit("xxxxxx","129.00",6); }



Ha strace-val futtatom, akkor ezt mondja:

[root@kako cip]# strace ./test4 execve("./test4", ["./test4"], [/* 34 vars */]) = 0 brk(0) = 0x91ff000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7867000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=110579, ...}) = 0 mmap2(NULL, 110579, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb784c000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20H\nK4\0\0\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1996196, ...}) = 0 mmap2(0x4b08b000, 1751644, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x4b08b000 mmap2(0x4b231000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a6) = 0x4b231000 mmap2(0x4b234000, 10844, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4b234000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb784b000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb784b6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0x4b231000, 8192, PROT_READ) = 0 mprotect(0x4b087000, 4096, PROT_READ) = 0 munmap(0xb784c000, 110579) = 0 --- {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x804858b} (Segmentation fault) --- +++ killed by SIGSEGV (core dumped) +++ Szegmentálási hiba (core készült)



Ezeknek az ismereteben tudna nekem segiteni valaki, mit kefeltem el?
Erosen gyanusak a valtozok, de elkepzelesem nincs, hogy mi lehet a bibi.
Mutasd a teljes hozzászólást!
Valahogy így kéne. Most nincs kedvem kipróbálni.

char *titkosit( char *instr, char *pwstr, long len ) { int j, pwlen, passnum; long i; char buff[1]; pwlen = strlen( pwstr ); passnum = 79; for ( i = j = 0; i < len; i++ ) { passnum = (int) (((passnum + ( i - len )) - 1 ) % 254) + 1; buff[0] = (instr[i] ^ (passnum ^ pwstr[j]) ); instr[i] = (buff[0] ? buff[0] : instr[i]); j = ( j >= pwlen ? 0 : j++ ); } return( instr ); } #define INSTR "xxxxxx" int main() { char *result; char in[10]; strncpy( in, INSTR, sizeof( result ) ); in[sizeof( in ) - 1] = '\0'; result = titkosit(in,"129.00",6); }
Mutasd a teljes hozzászólást!

  • Ha már az instr a return, akkor legyen így a függvény deklaráció:

    char *titkosit( char instr[], char pwstr[], long len )

    De mondja a fordító is.

    ---
    Látom módosítottad közben.
    a main-ben a result típusa nem char pointer kellene legyen?

    ---
    juj, most látom: ez mi a fészkes fene?
    main() { char result; char titkosit( char instr[], char pwstr[], long len )ű { ...
    Ugye nem a main-en be,-l implementáltad a titkosit függvényt?


    Ezeknek az ismereteben tudna nekem segiteni valaki, mit kefeltem el?
    Erosen gyanusak a valtozok, de elkepzelesem nincs, hogy mi lehet a bibi.

    Ezek ismeretében meg kellene venned a "Tanuljuk meg a C alapjait" c. könyvet. Esetleg egy könyvtárban is érdeklődhetsz.
    Mutasd a teljes hozzászólást!
  • Elsősorban ne csinálj beágyazott függvényt, mert olyan nincs C-ben.
    Mutasd a teljes hozzászólást!
  • Koszi a valaszodat, mert fontos lenne, hogy befejezzem.

    Igen, egy par lehetoseget mar vegigzongoraztam en is. Ha az altalad javasolt modszert probalom, akkor meg ezt mondja forditaskor:

    gcc test4.c -o test4 test4.c: In function &#8216;main&#8217;: test4.c:33:8: warning: assignment makes integer from pointer without a cast [enabled by default]


    Még meg kellene szoknom a gcc hibajelzeseit, mert nem ertem, hogy mit jelent az, hogy "a hozzarendeles integert csinal a pointerbol"?
    Vagy hogy mit tudok ezzel kezdeni.

    Azt a sort jeloli meg a hiba helyekent, ahol meghivom a fuggvenyt, gondolom ezt ugy erti, hogy a hiba ott keletkezik, de valoszinuleg nem ott van igazabol, hanem valahol a fuggvenydeklaracion belul.
    Mutasd a teljes hozzászólást!
  • ---
    Látom módosítottad közben.
    a main-ben a result típusa nem char pointer kellene legyen?
    ---
    Probaltam, a vegeredmeny ugyanaz


    ---
    juj, most látom: ez mi a fészkes fene?
    main()
    {
    char result;



    char titkosit( char instr[], char pwstr[], long len )ű
    {
    ...
    Ugye nem a main-en be,-l implementáltad a titkosit függvényt?
    --------

    Dehogynem. Emlitettem, hogy semmi kozom nem volt eddig c-hez, nem tudom, hogy hogy kellene csinalni. Mindenesetre az elso fuggveny az mukodott igy is. Azert szedtem reszekre, mert a masodik nem akar sikerulni sehogy sem.

    Hogy kellene deklaralni? A main-en kivul?


    ----
    Ezek ismeretében meg kellene venned a "Tanuljuk meg a C alapjait" c. könyvet. Esetleg egy könyvtárban is érdeklődhetsz.
    ----

    Faluban? Ez nem budapest, hogy elmegyek a libribe a konyvtar meg....
    Mindenesetre amit tudok, utanaolvasok, de nem megy egyik percrol a masikra sajnos
    De ha normalis c-vel foglalkozo weboldalt tudnal ajanlani, azt is megkoszonom.

    Mutasd a teljes hozzászólást!
  • a 'result' is, meg a 'titkosit' is 'char *' típusú legyen, ne 'char'
    Mutasd a teljes hozzászólást!
  • result = titkosit("xxxxxx","129.00",6);
    ennél a résznél az
    "xxxxxx"
    nem konstans?
    char *result; char input[]="xxxxxx"; result = titkosit(input,"129.00",6);
    így nem lenne jobb? (+ még * is kellene, ahogy Nevemteve írta)
    Bár én is csak kezdő vagyok.
    Mutasd a teljes hozzászólást!
  • Nos, felsiker. A fordito mar nem warningol, de segfault van meg mindig futtataskor.

    Hogy lehet kideriteni, hogy mi nem tetszik neki?
    (linux+gcc.)



    a 'result' is, meg a 'titkosit' is 'char *' típusú legyen, ne 'char'


    Igy modositottam:

    #include <stdio.h> #include <string.h> #include <stdlib.h> main() { char *result; char *titkosit( char instr[], char pwstr[], long len ) { int j, pwlen, passnum; long i; char buff[1]; pwlen = strlen( pwstr ); passnum = 79; for ( i = j = 0; i < len; i++ ) { passnum = (int) (((passnum + ( i - len )) - 1 ) % 254) + 1; buff[0] = (instr[i] ^ (passnum ^ pwstr[j]) ); instr[i] = (buff[0] ? buff[0] : instr[i]); j = ( j >= pwlen ? 0 : j++ ); } return( instr ); } *result = *titkosit("xxxxxx","129.00",6); }



    Mutasd a teljes hozzászólást!
  • szerintem így kellene:
    #include <stdio.h> #include <string.h> #include <stdlib.h> char *titkosit( char instr[], char pwstr[], long len ) { int j, pwlen, passnum; long i; char buff[1]; pwlen = strlen( pwstr ); passnum = 79; for ( i = j = 0; i < len; i++ ) { passnum = (int) (((passnum + ( i - len )) - 1 ) % 254) + 1; buff[0] = (instr[i] ^ (passnum ^ pwstr[j]) ); instr[i] = (buff[0] ? buff[0] : instr[i]); j = ( j >= pwlen ? 0 : j++ ); } return(instr); } main() { char *result; char input[]="xxxxxx"; result = titkosit(input,"129.00",6); }
    Mutasd a teljes hozzászólást!
  • result = titkosit("xxxxxx","129.00",6);
    ennél a résznél az "xxxxxx" nem konstans?


    Tulajdonkeppen az a program futasa alatt nem valtozik, ugyhogy akar allandokent is definialhatnam. Kiprobaltam, nem jo.


    char *result;
    char input[]="xxxxxx";
    result = titkosit(input,"129.00",6);
    így nem lenne jobb? (+ még * is kellene, ahogy Nevemteve írta)


    Igazabol a masodik parameter fog valtozni (ha egyszer a vegere erek) ugyhogy majd azt kell modositgatni, ez a result=... sor csak addig van igy bedrotozott allapotban benne, amig nem mukodik a program, utana majd at lesz irva, hogy stdin-rol kapja azt az egy parametert.
    Mutasd a teljes hozzászólást!
  • pedig ennél a résznél értéket adsz neki :
    instr[i] = (buff[0] ? buff[0] : instr[i]);
    Mutasd a teljes hozzászólást!
  • koszi. Igy mar hajlando nem segfaultolni. Megprobalom megerteni, hogy hol es miert kellett valtoztatni a valtozokra valo hivatkozason, mert nem egeszen tiszta, de probalkozom.
    Mutasd a teljes hozzászólást!
  • pedig ennél a résznél értéket adsz neki :


    Igaz. Valoszinuleg nem is menne const-kent deklaralva.
    Mutasd a teljes hozzászólást!
  • Igazabol a masodik parameter fog valtozni


    , akkor a
    char * result
    -ot el is lehet hagyni:

    void titkosit( char instr[], char pwstr[], long len ) { int j, pwlen, passnum; long i; char buff[1]; pwlen = strlen( pwstr ); passnum = 79; for ( i = j = 0; i < len; i++ ) { passnum = (int) (((passnum + ( i - len )) - 1 ) % 254) + 1; buff[0] = (instr[i] ^ (passnum ^ pwstr[j]) ); instr[i] = (buff[0] ? buff[0] : instr[i]); j = ( j >= pwlen ? 0 : j++ ); } } main() { char input[]="xxxxxx"; printf("%s\n",input); titkosit(input,"129.00",6); printf("%s\n",input); getchar(); }
    Mutasd a teljes hozzászólást!
  • Valahogy így kéne. Most nincs kedvem kipróbálni.

    char *titkosit( char *instr, char *pwstr, long len ) { int j, pwlen, passnum; long i; char buff[1]; pwlen = strlen( pwstr ); passnum = 79; for ( i = j = 0; i < len; i++ ) { passnum = (int) (((passnum + ( i - len )) - 1 ) % 254) + 1; buff[0] = (instr[i] ^ (passnum ^ pwstr[j]) ); instr[i] = (buff[0] ? buff[0] : instr[i]); j = ( j >= pwlen ? 0 : j++ ); } return( instr ); } #define INSTR "xxxxxx" int main() { char *result; char in[10]; strncpy( in, INSTR, sizeof( result ) ); in[sizeof( in ) - 1] = '\0'; result = titkosit(in,"129.00",6); }
    Mutasd a teljes hozzászólást!
  • Koszi mindkettotoknek! Az utobbi ket kodot kiprobalom, mindenkeppen szebbek annal, amit en csinaltam.

    csao
    kako
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd