Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

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

Diskussion: C-"Return makes integer from pointer without cast"-Problem im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hey Leute. Ich bin's mal wieder. Dieses Mal gibts ein kleines Code-Problem. Code: int search_letter(char letter,char *text) { while(*text) ...

Antwort
Alt 28.03.11, 21:34   #1 (permalink)
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Exclamation C-"Return makes integer from pointer without cast"-Problem

Anzeige

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
Ev0luti0n ist offline   Mit Zitat antworten
Alt 28.03.11, 21:44   #2 (permalink)
Senior Member
 
Benutzerbild von odigo
 
Registriert seit: 25.12.04
odigo Leistung: 8086odigo Leistung: 8086
odigo eine Nachricht über ICQ schicken
Likes: 54
Standard

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

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
odigo ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 28.03.11, 21:48   #3 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

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.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
Alt 28.03.11, 21:49   #4 (permalink)
Themenstarter
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard

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*
Ev0luti0n ist offline   Mit Zitat antworten
Alt 28.03.11, 21:52   #5 (permalink)
Themenstarter
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Welche GCC-Version verwendest du? Ich kann den Fehler mit GCC 4.2 nicht nachvollziehen.
Also ich verwende "Dev C++ 4.9.9.2". ( Drecks Freeware )
Ev0luti0n ist offline   Mit Zitat antworten
Alt 28.03.11, 21:56   #6 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Zitat:
Zitat von Ev0luti0n Beitrag anzeigen
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?
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
Alt 28.03.11, 22:10   #7 (permalink)
Themenstarter
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard

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
Zitat:
char tipp,wort[100];
[...]
if(search_letter(tipp,&wort))
{ printf("\n");
for(i=0;wort[i];i++)
{
if(wort[i]==tipp[i])
txt[i]=tipp[i];
//putchar(txt[i]);
}
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)?
Ev0luti0n ist offline   Mit Zitat antworten
Alt 28.03.11, 22:35   #8 (permalink)
Senior Member
 
Benutzerbild von odigo
 
Registriert seit: 25.12.04
odigo Leistung: 8086odigo Leistung: 8086
odigo eine Nachricht über ICQ schicken
Likes: 54
Standard

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.
odigo ist offline   Mit Zitat antworten
Alt 28.03.11, 22:42   #9 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

-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.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist offline   Mit Zitat antworten
Alt 29.03.11, 07:32   #10 (permalink)
Themenstarter
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Zitat von odigo Beitrag anzeigen
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" .
Ev0luti0n ist offline   Mit Zitat antworten
Alt 29.03.11, 21:11   #11 (permalink)
 
Benutzerbild von benediktibk
 
Registriert seit: 03.05.07
benediktibk Leistung: 8086benediktibk Leistung: 8086
Likes: 50
Standard

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.

Kannst du bitte sagen bei genau welcher Zeile der Compiler meckert? Ich schätze mal die Zeilenangabe steht bei der Fehlermeldung dabei.
mfg benediktibk
benediktibk ist offline   Mit Zitat antworten
Alt 29.03.11, 21:18   #12 (permalink)
Senior Member
 
Registriert seit: 13.07.08
enkore Leistung: K 6-3enkore Leistung: K 6-3enkore Leistung: K 6-3
Likes: 85
Standard

Zitat:
Zitat von Ev0luti0n Beitrag anzeigen
Also ich verwende "Dev C++ 4.9.9.2". ( Drecks Freeware )
Besorg die mal das aktuelle Codeblocks-Release mit einem GCC von hier -> TDM-GCC
__________________
"It is the human race! The deterioration of the spirit of man. Man undermining himself, causing a self-willed, self-imposed, self-evident self-destruction."
+++ BREAKING +++ Troll ertrinkt im Planschbecken +++
enkore ist offline   Mit Zitat antworten
Alt 30.03.11, 13:52   #13 (permalink)
Themenstarter
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard

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.
Ev0luti0n ist offline   Mit Zitat antworten
Alt 01.04.11, 19:39   #14 (permalink)
 
Registriert seit: 01.04.11
Alighieri Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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

Geändert von Alighieri (01.04.11 um 19:42 Uhr)
Alighieri ist offline   Mit Zitat antworten
Alt 01.04.11, 21:04   #15 (permalink)
 
Benutzerbild von mauralix
 
Registriert seit: 17.04.06
mauralix Leistung: 8086
Likes: 3
Standard

Viele Standardfunktionen gibt es ja in C nicht, aber die es gibt sollte man nutzen. z.B.: strchr um ein Zeichen zu suchen.
mauralix ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » C-"Return makes integer from pointer without cast"-Problem
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61