Fehler



  • Ich habe ab un zu, wenn ich programmiere ein paar Fehler, die ich nicht interpretieren kann.
    Vielleicht könnt ihr mir helfen ?!?

    - Error: Unresolved external '_alloc' refrenced from C:\...

    Was bedeuetet dieser Fehler und wer kann mir weiterhelfen ?!?



  • cHillb3rT schrieb:

    Ich habe ab un zu, wenn ich programmiere ein paar Fehler, die ich nicht interpretieren kann.
    Vielleicht könnt ihr mir helfen ?!?

    - Error: Unresolved external '_alloc' refrenced from C:\...

    Was bedeuetet dieser Fehler und wer kann mir weiterhelfen ?!?

    Ich verstehe kein Wort von dem Fehler. Der ista auch kompiler abhängig.
    Welchen Kompiler hast du? Und handelt es sich um ANSI C oder WinAPI?



  • Es handelt sich hierbei um ANSI C und als Compiler benutze ich den Borland Compiler 32 mit der MS-DOS Eingabeaufforderung.



  • Zeig deinen Code. Dieser Fehler ist mir komplett unbekannt



  • Sieht so aus, als hättest du vergessen eine Lib in das Projekt einzubinden.
    Siehe auch http://www.c-plusplus.net/forum/viewtopic.php?t=39193



  • Hab ich an sich nicht:

    /* htoi: Hexadezimalzahlen in Dezimalzahlen umwandeln /
    #include <stdio.h> /
    Standard-Definitonsdatei /
    #include <ctype.h> /
    Bibliotheks-Datei */
    #include <string.h>

    int htoi(char s[]); /* Funktion htoi liefert uns einen s-Wert, der den char-Tyü besitzt /
    int pow(int base, int exp); /
    Die Funktion pow */

    int main()
    {
    char hex[11]; /* Der Variablen "hex" wird der Char-Typ zugewiesen und zudem noch eingeplant, dass diese Variable 11 Werte aufnehmen kann. Mehr als 11 Zeichen führen zum Absturz des Programms */

    printf("\n-----Hex-->Dez-----\n\n"); /* Text am Anfang des Programms */

    printf("Hex (0x...) : "); /* Nochmaliger Text neben der Eingabe der Hexadezimal-Zahl /
    scanf("%s", hex); /
    Der eingegebene Text wird bearbeitet mit "scanf" */

    printf("Hex: %s ---> Dez: %d\n\n", hex, htoi(hex));

    return 0; /* Wenn die Ausgabe gemacht wurde, wird der Wert 0 als Vollendung einer Umwandlung zurückgegeben */
    }

    int htoi(char s[]) /* htoi gibt den Wert s zurück, weil dieser Wert der umgewandelte Wert ist, den man zu Anfang eingegeben hat /
    {
    unsigned int dez=0, i, j=0; /
    Die Variablen bekommen ihre Werte zugewiesen. "i" ist dabei eine Variable zum Hochzählen von "s", also dem eingegeben Text. "j" dient ebenso als Varibale zum Hochzählen und wird aber nur bei pow verwendet */

    for (i=strlen(s)-1; i>1; i--) {

    if ( isdigit(s[i]) ) /* isdigit ist in diesem Falle ein Vergleich, denn isdigit ist diesem Quellcode ähnlich: s[i] >='0' && s[i] <= '9'. Im Klartext bedeutet dies, wenn eine Zahl zwischen 0 und 9 im eingegeben Text vorhanden ist, dann werden die nächsten Anweisungen ausgeführt */ {

    dez += (s[i] - '0') * pow(16,j); /* dez = dez + (s[i] - '0') ist die genaue Ausführung dieser Programmzeile. Die Umrechung der Dezimalzahl bildet sich wie folgt ab. Der vordere Teil der Rechnung ist klar, denn die Dezimal wird aus dem eingegeben Wert gebildet. Dazu kommt aber noch der Wert aus der Funktion "pow", der aus 16 Werten (0 - 9 und A - F) gebildet wird */
    }

    if ( (s[i] >= 0x41 && s[i] <= 0x46) || (s[i] >= 0x61 && s[i] <= 0x66) ) {// a...f OR A...F //

    s[i]=tolower((s+i)); / Der eingegebene Bereich wird in Kleinbuchstaben umgewandelt, wenn welche vorhanden sind /
    dez += (s[i] - 'a' + 10) * pow(16,j); /
    Die Dezimalzahl wird aus den ausgelesenen Werten von "s[i]" gebildet. */
    }

    j++; /* "j" wird inkrementiert */
    }

    return dez; /* Rückgabe der Dezimalzahl bzw. des Dezimalwertes */
    }

    int pow(int base, int exp) /* Die Funktion rechnet die Hexadezimalzahlen um /
    {
    int pow=1,i; /
    Datentypvergabe und Wertevergabe */

    for (i=0; i < exp; i++) /* Solange "i" nicht gleich null ist und i kleiner als der Exponent dann wird "i" reinitialisiert */
    pow = base; / (pow = pow * base) /
    return pow; /
    Rückgabe des "pow-Wertes" */
    }



  • Benutze ab jetzt bitte die Code-Tags.
    Der Fehler muss irgendwo bei dir (Compiler-Einstellungen?) liegen. Bei mir lässt es sich ohne Probleme kompilieren.



  • cHillb3rT schrieb:

    - Error: Unresolved external '_alloc' refrenced from C:\...

    hast du dich vertippt?
    sollte es vielleicht 'malloc' heissen?



  • net schrieb:

    cHillb3rT schrieb:

    - Error: Unresolved external '_alloc' refrenced from C:\...

    hast du dich vertippt?
    sollte es vielleicht 'malloc' heissen?

    Es gibt auch die Funktion alloc().
    Allerdings finde ich sie nicht in dem geposteten Code (auch kein malloc()) 😕 .

    @chillbert
    Werden noch andere Dateien compiliert? Gibt die Fehlermeldung an, in welcher Zeile sich der Fehler befindet? Ist das auch der Code der Datei, die bei dem Fehler angegeben ist?



  • Mit dem einbinden einer lib ist nicht gemeint das das entsprechede h File beim Compilieren angegeben ist (das muß es zwar auch), sondern das beim linken die zugehörigen *.lib files mit angegeben sind um das komplette exe File zu erzeugen.

    Es sieht so aus als ob dein projektfile einen Fehler hat.

    Simpelste Lösung.

    lege ein komplett neues Projekt an und kopiere dann deine Datei hinzu.



  • /* Ausgabe von Eingabezeilen mit mehr als 80 Zeichen */

    #include <stdio.h>
    #include <ctype.h>

    #define MAXLINE 1000
    #define LONGLINE 80 /* Maximale Länge der Eingabezeile */

    int getline(char line[], int maxline);

    /* Zeilen ausgeben, die länger als LONGLINE sind */

    main()
    {
    int len;
    char line[MAXLINE];
    while ((len = getline(line, MAXLINE)) > 0)
    if(len > LONGLINE)
    printf("%s", line);
    return 0;
    }

    Hier haben wir wieder einen neuen Fehler bei einem anderen Programm. ERROR: Unresolved external '_getline' referenced from C:\....a1-17.obj



  • 1. Benutze die CPP tags selber!

    2. Unresolved external '_getline' referenced from C:\....a1-17.obj
    heißt, dass getline nicht gefunden wurde.

    In deinem Code wird getline definiert, aber du schreibst du Funktion nicht. Glaubst du der C Compiler kann saubern? Du musst nämlich den Code der Funktion getline schreiben oder dem Linker die obj Datei übergeben, die getline implementiert.

    Und noch was, welchen Compiler benutzt du?



  • Ich arbeite mit dem Rohmaterial der Bearbeitung:
    - Eingabeaufforderung plus Borland C Compiler 32
    - Editor mach ich den Rest

    Ich bekomme erst die nächsten Tage eine neue Entwicklungsumgebung !



  • #include <stdio.h>
    
    #define TABINC 8 /* Tabulator-Abstand */
    
    /* Tabulatorzeichen durch entsprechende Anzahl Leerzeichen ersetzen */
    
    void main()
    {
     int c, nb, pos;
    
     pos = 1; /* Position des Zeichnes in Zeile */
     while ((c = getchar()) != EOF)
      {
      if (c == '\t')
       {
        nb = 0; /* nötige Anzahl Leerzeichen */
       nb = TABINC - (pos - 1) % TABINC; /* Die Anzahl der Tabulatorzeichen wird hier ermittelt */
       while (nb > 0)
        {
        putchar(' ');
        ++pos;
        --nb;
        }
       } else if (c == '\n') /* Zeilentrenner */
         {
         putchar(c);
         pos = 1;
         } else  /* alle anderen Zeichen*/
           {
           putchar(c);
           ++pos;
           }
    
      }
    }
    

    Ich sollte normalerweise damit die Anzahl der Tabulatorzeichen durch Leerzeichen damit ersetzen können, aber er spuckt bei der Ausgabe immer den gleichen String aus, wie er in der Eingabe schon vorhanden ist.



  • Ich würde dir empfehlen dich mal mit switch() vertraut zu machen. if() else if()... wird auf die Dauer sehr unübersichtlich.



  • Bei dieser Übung dürfen wir kein switch() verwenden. Daher hab ich es probiert mit if-then-else zu lösen.

    Wie würde denn die Lösung mit switch() aussehen ?



  • cHillb3rT schrieb:

    Ich sollte normalerweise damit die Anzahl der Tabulatorzeichen durch Leerzeichen damit ersetzen können, aber er spuckt bei der Ausgabe immer den gleichen String aus, wie er in der Eingabe schon vorhanden ist.

    Ist das nicht das, was du wolltest? Wie willst du denn in der Ausgabe Tabulatoren und ersetzte Leerzeichen unterscheiden?



  • Man geht ja den String entlang und schreibt mit nb die Anzahl der Tabulatoren auf.

    Eine genau Erklärung liefere ich dir heute Abend, wenn ich Zeit hab, weil jetzt muss ich hier was weitermachen 😉



  • cHillb3rT schrieb:

    Bei dieser Übung dürfen wir kein switch() verwenden. Daher hab ich es probiert mit if-then-else zu lösen.

    Wie würde denn die Lösung mit switch() aussehen ?

    Warum sollte man da kein switch() verwenden dürfen?? Will man euch absichtlich quälen?

    Wie das aussieht? Ganz einfach:

    switch(c)
    {
       case '\t':
          ...
          break;
       case '\n':
          ...
          break;
       default:
          ...
          break;
    }
    


  • Warum sollte man da kein switch() verwenden dürfen?? Will man euch absichtlich quälen?

    Wie das aussieht? Ganz einfach:

    Sie wollen uns quälen ganz genau 😉
    K+R Ansi C ist auch an manchen Punkten sehr krass muss ich sagen, dass Buch hätte man auch einfacher machen können.

    Ich hab hier noch ein ähnliches Programm gemacht !:

    #include <stdio.h>
    
    #define TABINC 8 /* Symbolische Konstante */
    
    void main()
    {
     int c, nb, nt, pos; /* Integer-Typen */
    
     nb = 0; /* Anzahl der Leerzeichen */
     nt = 0; /* Anzahl der Tabulatorzeichen */
     for (pos = 1; (c = getchar()) != EOF; ++pos) /* Position 1 wird als Wortanfang bzw Zeichenkettenanfang festgelegt. "c" wird bearbeitet, wenn es ungleich dem Zeichenkettenende ist. Danach wird die Position inkrementiert. */
    	if (c == ' ') /* Wenn c gleich leerer Stelle ist, nicht gleich Leerzeichen */
    	 {
    	  if (pos % TABINC != 0) /*  */
    		++nb; /* Zu der Anzahl der Leerzeichen wird eins hinzugefügt */
    	else {
    	 nb = 0; /* Erneute Initialisierung von nb */
    	 ++nt; /* Inkrementierung von "nt" */
     	 }
    	} else { /*  */
    	   for ( ; nt > 0; --nt) /* Keine Initialisierung von nt, aber dennoch gibt es eine Reinitialisierung von "nt" durch Dekrementierung */
    		putchar('\t'); /* Ausgabe des Tabulatozeichens */
    	   if (c == '\t') /* Wenn c = einem Tabulatorzeichen ist, dann wird nb auf 0 gesetzt */
    		nb = 0; /* Hier wird nb auf 0 gesetzt */
    	   else
    		for ( ; nb > 0; --nb) /* nb ist größer als 0 wird leeres Zeichen ausgegeben und nb dekrementiert */
    			putchar(' '); /* Ausgabe eines leeren Zeichend */
    		putchar(c); /* Ausgabe von "c" */
    		if (c == '\n') /* Wenn "c" gleich dem Zeilentrenner ist dann wird Position auf 0 gesetzt */
    		 pos = 0; /* Position wird auf 0 gesetzt */
    		else if (c == '\t') /* und falls c gleich dem Tabulatorzeichen ist, dann wird folgendes gemacht */
    		 pos = pos + (TABINC - (pos - 1) % TABINC) - 1; /* Position ergibt sich aus der jetzigen Position + dem gezählten Tabulatorzeichen - der jetzigen Position-1... */
    }
    }
    

Anmelden zum Antworten