C atoi Funktion

  • Hallo. Habe ständig einen Speicherzugriffsfehler und verstehe nicht weshalb.
    Folgender Versuch.

    int a[4];
    int i;


    for (i=0;i<4;i++)
    a[i] = atoi(zahl[i]);

    // zahl ist hierbei einfach ein char[4] array. doch beim übersetzen schreibt er mir als Warning schon hin "passing arg 1 of atoi makes pointer from integer without a cast". Ich verstehe das irgendwie nicht, wie ich das sonst machen könnte. Ich brauche nun mal die einzelnen Characters hier an dieser Stelle.

    Hat wer eine Idee, was ich hier falsch mache, arbeite mich gerade so richtig in C ein....

    Danke im Voraus , fips

  • was steht denn in zahl[i] ?
    welcher datentyp ?

    ich vermute mal, daß das keine c-strings bzw pointer darauf sind. das ist dann natürlich tödlich.

    genaueres (gewünschtes) input output verhalten beschreiben und es kann geholfen werden.


    Trading for a living [equities,futures,forex]

  • soweit ich weiß erwartet atoi einen cstring, was wiederum nur ein pointer auf ein char array ist.
    du übergibst der funktion atoi aber keinen cstring (-> pointer auf ein char array) sondern ein char. das char wird intern wiederrum (wie ein pointer) als zahl dargestellt, darum gibt es eine impliziete typumwandlung, von wo auch die warnung beim kompilieren kommt.
    atoi versucht dann auf ein cstring zuzugreifen, greift auf irgendeinen speicherberreich zu und dann gibt es den speicherzugriffsfehler.

    in deinem fall ist die einfachste lösung folgende:

    Code
    int a[4];
        int i;
    
       for (i = 0; i < 4; i++)
       	a[i] = zahl[i] - '0';
  • also nach den erfahrungen meines ferialjobs *g* müsste es so gehen

    Code
    char * pZahl;
    int a[4];
    int i;
    
    
    pZahl = &zahl;
    
    
    for (i=0;i<4;i++)
       a[i] = atoi(pZahl[i]);



    ps: kann das erst morgen in der firma testen, habe zuhause gerade kein C installiert...
    pss: kann mich jetzt auch total teuschen, bin jeden tag 8 stunden am C programmieren obwohl ich noch nicht wircklich den durchblick habe... :)

    90% aller Fehler sitzen 60 cm vor dem Bildschirm

  • Warum eigentlich atoi wenn die Zahlen eh schon ein Array von 4 (8-bit) Zahlen ist ?

    Was spricht gegen
    for (i=0; i<4; i++) a[i]=zahl[i]; ?

    bzw WAS genau repräsentiert zahl[i] bzw das gesamte array zahl ?


    Trading for a living [equities,futures,forex]

  • Danke an alle.
    Alex_K ---->> Deine Erläuterung leuchtet mir ein. Doch was hat das mit dem - '0' auf sich. Hab solche Varianten schon desöfteren gesehen, bin mir aber nicht im klaren darüber , weshalb man das verwendet.

    L.g Fips

  • Zitat von fips

    Doch was hat das mit dem - '0' auf sich.

    das ist ganz einfach. der c standard garantiert, dass die interne representation
    der zeichen 0 - 9 aufeinanderfolgend ist. dh: '9' - '0' ist 9, '5' - '0' ist 5 ...

    fuer ein system das ascii als zeichenrepresentation verwendet wuerde das so
    ausschaun:

    57 (ascii wert von '9') - 48 (ascii wert von '0') = 9 (also die numerische representation des zeichens 9)

    wuerde man die numerischen werte verwenden so waere der code nicht portabel, weil
    verschiedenen systemen unterschiedliche zeichensaetze verwenden (ascii, EBCDIC,
    utf-8, ...)

  • -'0' wandelt den ASCII Code von Ziffernzeichen in Zahlen 0-9 um.

    Unter der Voraussetzung, daß die chars[4] wirklich Ziffernzeichen (ohne 0-terminierung) enthalten, ist der Code von Alex_k das was du willst.

    Aber er mußte, wie wir alle, RATEN, was du denn genau brauchst.
    Denn nachwievor Verweigerung deinerseits, zu erklären, was denn in char[4] Array drinnen steht :rolleyes:
    Naja, daß da 4 bytes drinnen sind, ist unvermeidbar, aber was soll es sein ?

    Mfg, LB


    Trading for a living [equities,futures,forex]

  • Zitat von Lord Binary

    -'0' wandelt den ASCII Code von Ziffernzeichen in Zahlen 0-9 um.

    es ergibt _immer_ den wert der ziffer solange das character, von dem '0' abgezogen wird, '0'...'9' ist. dies gilt _nicht nur_ fuer den ascii zeichensatz
    (siehe ISO/IEC 9899:1999 5.2.1 (3))

  • Ja, korrekt.
    Danke für die kleine aber feine Ergänzung :D

    Um auf mein Lieblingsthema in diesem Thread zurückzukommen: Woher wissen wir, was die chars[4] sein sollen bzw wie sie befüllt worden sind ?
    *grummel*

    Mfg, LB


    Trading for a living [equities,futures,forex]

  • es stehen zeichen von 0-9 drinnen ....,...


    l.g fips und herzlichen dank für die Erklärungen, da hätt ich noch lange kompliziert gearbeitet...

  • Also z.b char[x]='0'; ?

    Die Quintessenz werde eh schon gesagt, sowas ist eben kein c-string, den atoi erwartet.

    In diesem Beispiel sollte Zahl den Wert 12345 bekommen.

    char zahlstring[]="12345";
    int zahl;
    zahl=atoi(zahlstring);


    Trading for a living [equities,futures,forex]

  • atoi wuerd ich aber nur verwenden, wenns ein kleines hobby-programm fuer dich selber ist.

    ansonsten ist 'strtol' viel besser (aber auch umstaendlicher), weil bei atoi() du nicht weisst, ob die operation fehlgeschlagen ist, oder die zahl wirklich 0 war (oder so aehnlich, jedenfalls habens das in sysprog gesagt).

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!