C-"Return makes integer from pointer without cast"-Problem

  • Themenstarter Themenstarter Ev0luti0n
  • Beginndatum Beginndatum
E

Ev0luti0n

Guest
Hey Leute. Ich bin's mal wieder.
Dieses Mal gibts ein kleines Code-Problem.
Code:
int search_letter(char letter,char *text)
                    {
                        while(*text)
                        {
                                   if(*text=letter)
                                                    return 1;
                                   else    
                                          *text++;
                        }
                      return 0;
                    }
Das ist meine Funktion.
Wenn ich diese jetzt benutz' , dann erhalte ich von Dev C++ immer die Warnung "Return makes integer from pointer without cast". Und ich verstehs einfach nich warum diese Meldung kommt.
Eine Erklärung wäre ganz nice ;)
(Kein "Ja weil das Return einen Integer vom Zeiger ohne Cast macht" ;))
Lg ev0luti0n
 
Code:
if(*text=letter)
= ist eine Zuweisung. Bei einem if muss true oder false rauskommen, sprich du brauchst einen Vergleichsoperator, z.B. ==. Ein klassischer Fehler :D

Der Vergleich von einem Pointer mit einem Char macht aber imho auch wenig Sinn, aber für eine genaue Erklärung ist mein Zeit mit C zu lang her :D
 
Welche GCC-Version verwendest du? Ich kann den Fehler mit GCC 4.2 nicht nachvollziehen.

Code:
bitmuncher@alpha:~> gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
bitmuncher@alpha:~> gcc -c -Wall test.c
test.c: In function 'search_letter':
test.c:3: warning: suggest parentheses around assignment used as truth value
test.c:6: warning: value computed is not used

Und diese Warnung kommt von der von odigo angesprochenen Zuweisung im if-Statement.
 
Hey Danke für die Anmerkung ;). Grr. Der scheiß mit dem Vergleichsoperator passiert andauernd aber daran liegts nich. Gleiche Warnung ("passing arg 1 of 'search letter' makes integer ......").
hmmm. Es liegt also schon an der Parameterübergabe. Aber an was genau*grübel*
 
Gleiche Warnung ("passing arg 1 of 'search letter' makes integer ......").

Das ist offenbar nicht die gleiche Warnung. Beim ersten Mal bekommst du die Warnung aufgrund des Return-Werts, während nun explizit der Parameter angemangelt wird und das ist eigentlich klar, denn char ist nunmal kein int und ein Vergleich der Art 'if(wert1 == wert2)' ist immer ein Vergleich von Integer-Werten. Ohne -Wall würdest du diese Warnung vermutlich nichtmal bekommen, da char's im Normalfall bei Vergleichen automatisch gecastet werden. Es müsste also heissen:

Code:
if((int)*text == (int)letter)...

Da aber der Parameter bemängelt wird, würde ich eher darauf tippen, dass beim Aufruf der Funktion irgendwo ein Fehler ist. Wie rufst du die Funktion denn auf und welche Werte/Datentypen werden dabei übergeben?
 
Also mit den Casts geht es auch nicht... Die Warnings sind die selben , jedoch hab ich oben n Teil weggelassen. Sorry ;).
Also ich verwende sie im Code bei
char tipp,wort[100];
[...]
if(search_letter(tipp,&wort))
{ printf("\n");
for(i=0;wort;i++)
{
if(wort==tipp)
txt=tipp;
//putchar(txt);
}

Hoffe das hilft.
PS: Was ist -wall?(eine Compiler-Anweisung , damit dieser nicht automatisch castet?) und gibt es Möglichkeiten solche Bedingungen zu optimieren(Bin noch ein Newbie)?
 
Du solltest die Methode ändern wie du dir C beibringen willst. Ich seh in deinem Code auf den ersten Blick mindestens 5 grundsätzlich Fehler.
Such dir ein Buch/Tutorial was wirklich bei Hello World anfängt und arbeite dich schrittweise weiter. Punkt für Punkt.
 
-Wall sorgt dafür, dass der Compiler sämtliche Warnungen auswirft, auch zu unsauberem Code u.ä.. Oft findet man so Fehler, auf die man sonst nicht aufmerksam wird, weil ihre Ursache in "fehlerhaften" Code davor zu finden ist. Beim Entwickeln sollte man diesen Parameter immer nutzen. Probier's mal mit diesem Parameter und poste die Warnungen + zugehörigen Code, denn momentan kann ich deinen Fehler nicht nachvollziehen:

Code:
bitmuncher@alpha:~> cat test.c
int search_letter(char letter,char *text) {
  while(*text) {			    
    if(*text==letter)
      return 1;
    else    
      *text++;
  }
  return 0;
}
bitmuncher@alpha:~> gcc -c -Wall test.c
test.c: In function 'search_letter':
test.c:6: warning: value computed is not used

Die Warnung "value computed is not used" ist allerdings bei Objektdateien normal, wenn man sie einzeln kompiliert, da die Werte ja tatsächlich innerhalb der Funktion nicht benutzt werden, und hat mit dem von dir beschriebenen Fehler nichts zu tun.
 
Du solltest die Methode ändern wie du dir C beibringen willst. Ich seh in deinem Code auf den ersten Blick mindestens 5 grundsätzlich Fehler.
Such dir ein Buch/Tutorial was wirklich bei Hello World anfängt und arbeite dich schrittweise weiter. Punkt für Punkt.

Nett dass du mich darauf hinweist , aber wenn dann würd ich diese "grundsätzlichen Fehler" auch gerne genannt haben. Nicht so "es ist schlecht. mach's besser" ;).
 
Code:
*text++;
Die Zeile meinst du wahrscheinlich anders:
Code:
text++;
Damit erhöhst du den Pointer um eins auf das nächste Zeichen, nicht wie zuvor den (ASCII-)Wert des ersten Zeichens.
Und, kleiner Tipp am Rande, wenn du sowieso nur 0 oder 1 zurückgibst tuts ein bool als Rückgabewert auch. Ist leichter zum Lesen und verhindert somit Fehler.

Ich weiß nicht wo odigo die Unmengen an restlichen Fehlern findet, aber vielleicht bin ich einfach zu müde, als dass ich sie sehen würde. :wink:

Kannst du bitte sagen bei genau welcher Zeile der Compiler meckert? Ich schätze mal die Zeilenangabe steht bei der Fehlermeldung dabei.
mfg benediktibk
 
Den Error gibt er in der Zeile mit dem Aufruf den Funktion...
Zu der Software:Habe mir gestern schon CodeBlocks geholt. Ist wirklich um einiges besser.
 
Damit erhöhst du den Pointer um eins auf das nächste Zeichen, nicht wie zuvor den (ASCII-)Wert des ersten Zeichens.

Das stimmt nicht , *pointer++ mit diesem Ausdruck zählt er nicht den ASCII Wert hinauf sondern übergibt ganz normal wie auch bei *pointer einen Wert. Postkrement wird dann die Adresse hinauf gezählt auf das nächste Objekt.

Bsp.

Code:
int  *pi,*pi2;
pi2=pi;
*pi++=5;
*pi=99;
printf("%i\n%i",*pi2,*pi);

Ausgabe: 5 und 99
 
Zuletzt bearbeitet:
Das stimmt nicht , *pointer++ mit diesem Ausdruck zählt er nicht den ASCII Wert hinauf sondern übergibt ganz normal wie auch bei *pointer einen Wert. Postkrement wird dann die Adresse hinauf gezählt auf das nächste Objekt.

Bsp.

Code:
int  *pi,*pi2;
pi2=pi;
*pi++=5;
*pi=99;
printf("%i\n%i",*pi2,*pi);
Ausgabe: 5 und 99

Grml, warst schneller als ich ;)
Trotzdem wäre es nett wenn du dem Pointer pi eine gültige Addresse zuweist, sonst kann es passieren das der Code crashed.

MfG
Inliferty

@ Author:
Musst du DevCpp verwenden oder tut es auch eine andere freie IDE?
DevCpp wird ja nun doch schon eine Zeit lang nichtmehr weiterentwickelt und man sollte sich unbedingt nach Alternativen umsehen. (CodeBlocks, Microsoft Visual Studio Express).
 
Zuletzt bearbeitet:
Zurück
Oben