Compiler Error bei Funktion Überdeckung von Variable!

Bitte aktiviere JavaScript!
Guten Tag,

irgendwie verstehe ich hier mal wieder etwas nicht :(
In Java Funktioniert so etwas:

Java:
public static int test(int zahl) {
        return zahl*4;
    }
    
    
    public static void main(String[] args) {
        int test = test(4);
        System.out.println(test);

wenn ich so etwas in C versuche kommt eine Warunung vom Compiler.
C:
int test(int zahl) {
    return 5*zahl;
}

//... in der main das hier:
    int test = test(4);
    printf("%d\n",test);
Fehlermeldung:
Code:
 In function ‘main’:
PrimzahlenTest.c:26:13: error: called object ‘test’ is not a function or function pointer
  int test = test(4);
             ^~~~
PrimzahlenTest.c:26:6: note: declared here
  int test = test(4);
Verdeckt nun die Variable test die Funktion test? Oder liegt es an etwas anderem?

LG
 
Oh sorry, ich habe mich vertan...

C:
#include <stdio.h>

int
testa (int zahl)
{
  return 5 * zahl;
}

int
main ()
{
  int test = testa (4);
  printf ("%d\n", test);
}

geht, aber test nicht. Die Begründung steht hier:

 
Danke für die schnelle antwort :)
Mal wieder stackoverflow.com :D ^.^ Da gibt es glaube schon fast alles :p

Was mir auch nicht bewusst war es gibt kein Überladen bei C :(
Wieso weiß ich nicht und wie man dann Überladen hin bekommt in Java, C++, etc. weiß ich auch noch nicht :D

:) Da Lernt man Java echt sehr zu schätzen :)

LG
 
Ich hatte auch gegoolet doch nix gefunden. Mal wieder das Falsche eingeben :D

Dumm ist kein Mensch! Doch ich weiß was du meinst :)
Da merkt man mal wieder was man noch alles lernen muss!!! Mal gespannt wie es noch weiter geht. Mit den Zeigern kämpfe ich immer noch :(

LG
 
Das ist trotzdem super Deprimierten.
Vor allem vermisst man da echt JAVA :) und ich hab erst mit C angefangen.

Was hierbei jetzt noch dazu kommt ist, ich Lerne und Lerne und stopfe hier und da mal so Löscher von meinen Fragen doch es werden nicht WENIGER eher MEHR!!! :(

Bei Java hat mir das ganze später ja so weit wie ich gekommen bin Sinn gemacht, doch dabei habe ich mich ja nie mit dem tiefen beschäftigt :( Also wie Funktioniert die JVM, wie Funktioniert so ein Compiler, etc.
Nun Frage ich mich das alles erneut und bekomme nur noch mehr Fragezeichen in meinem Kopf. Das alles "irgendwie" aufeinander Aufbaut sollte jedem Klar sein :) Doch wie :D Ich weiß auch das so etwas eigentlich nicht "mehr so wichtig!" ist wie es Funktioniert. Das wäre das selbe wie wenn man Mathematik oder Physik Studieren geht und alles beweisen muss/will um es zu verstehen obwohl die beweise schon da sind und man weis das es so geht! grrrr..... Gehirnabsturz :D

naja mal schauen wie es weiter geht.
Das Thema hat mich definitiv wieder mehr Verwirrt als alles andere :D

Danke für die nette Hilfe :)

LG
 
Mathematik oder Physik Studieren geht und alles beweisen muss/will um es zu verstehen obwohl die beweise schon da sind und man weis das es so geht!
Allerdings wird man in diesen Studiengängen auch stärker darauf getrimmt die formellen Voraussetzungen dieser oder jener Gesetze / Werkzeuge / Verfahren / ... zu beachten und zu befolgen. Um beim obigen Beispiel zu bleiben: der Python 3.7 Interpreter hat weniger Probleme mit gleichlautenden Variablen und Funktionsnamen.
Python:
def test(zahl):
  return zahl*5

test = test(4)
print(test)
Ergebnis auf der Kommandozeile: 20
Nebenbei hat auch der VC++ Compiler mit dem oben genannten C-Code sein Problem.
 
Nebenbei sei angemerkt, in Assembler sieht Dein Programm so aus:
Code:
testa:
.LFB0:
	pushq	%rbp
	movq	%rsp, %rbp
	movl	%edi, -4(%rbp)
	movl	-4(%rbp), %edx
	movl	%edx, %eax
	sall	$2, %eax
	addl	%edx, %eax
	popq	%rbp
	ret
.LFE0:
	.size	testa, .-testa
	.section	.rodata
.LC0:
	.string	"%d\n"
	.text
	.globl	main
	.type	main, @function
main:
.LFB1:
	pushq	%rbp
	movq	%rsp, %rbp
	subq	$16, %rsp
	movl	$4, %edi
	call	testa
	movl	%eax, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, %esi
	leaq	.LC0(%rip), %rdi
	movl	$0, %eax
	call	[email protected]
	movl	$0, %eax
	leave
	ret
Es gibt zwar das Funktionslabel testa, aber der lokale Variablenname test taucht nicht mehr auf - demzufolge ist es einfach eine Beschränkung des C Compilers.
 
Was mir auch nicht bewusst war es gibt kein Überladen bei C :(
Wieso weiß ich nicht
Ich habe in ähnlicher Angelegenheit schon mal was dazu geschrieben: Du musst C mit völlig anderen Augen sehen als Java. Die Ursprünge reichen bis in die 60er-Jahre zurück. Du kannst die Zeit damals nicht mit Mitte der 90er vergleichen. C wurde für die Weiterentwicklung von Unix "erfunden", so dass Unix eines der ersten Betriebssysteme war, das nicht in Assembler geschrieben wurde bzw. werden musste. Für so "Unfug" wie Überladen etc. war RAM und Laufzeit (z. B. für den Compiler) viel zu wertvoll (wenn ich mich recht entsinne war Ende der 80er eine 128 KB RAM-Erweiterung für etwa 200 DM - nach heutigen Maßstäben etwa 160-180 € - zu haben). Das ist nur meine persönlich Meinung.

wie man dann Überladen hin bekommt in Java, C++, etc. weiß ich auch noch nicht
Kombiniere die Bezeichner der Methode/Funktion mit Parametertypen. Dann ist A(int) etwas anderes als ein A(String) oder ein A(int, int) usw.
 
Sry für die späte Nachricht hier, ich hatte leider einiges um die Ohren :(

Danke an euch drei @M.L. , @Tobias-nrw und @mihe7
Ich glaube so langsam verstehe ich etwas mehr :)

Eine Frage hätte ich noch wie bekommt man den C Code in Assembler umgewandelt den @Tobias-nrw hat das Programm sicherlich nicht in Assembler geschrieben oder etwa doch?
Man kann sich Java Code ja auch in Assembler ausgeben lassen :) thx @mihe7 dazu hatte ich damals ja auch einige Fragen die von die geklärt werden konnten soweit ich mich entsinnen kann :)
 
Also ganz allgemein... noch ohne Spezialoptionen...
Du hast eine main.c Datei und den gcc.
Dann: gcc -O0 -S main.c -o main1.S

main1.S kannst du mit einem Editor ansehen/verändern.

Übersetzen: gcc main1.S -o deineDatei.endung
 
Das ist ja mal nett :)
Wenn man jetzt noch etwas mehr Assembler verstehen würde dann ist es sicherlich auch Hilfreich :)
Denn ich sehe auch zum ersten mal das ein String im Assembler-Code enthalten sein kann also ähnlich wie im C - Code das kenne ich auch nicht :D
Naja ich bleibe erst mal bei Java und C/C++ :D und übe fleißig weiter.

LG
 
Wenn dir gerade lwl ist so compiliere das mal:
Code:
	.file	"ab.c"
	.text
	.globl	testa
	.def	testa;	.scl	2;	.type	32;	.endef
	.seh_proc	testa
testa:
	pushq	%rbp
	movq	%rsp, %rbp
	pushq	%r12
	subq	$32, %rsp

	movq		$5, %r12
	cvtsi2sd	%r12, %xmm0
	cvtsi2sd	%ecx, %xmm1
	mulsd		%xmm0, %xmm1
	cvtsd2si	%xmm1, %eax

	addq	$32, %rsp
	popq	%r12
	popq	%rbp
	ret
	.seh_endproc

	.def	__main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
.LC0:
	.ascii "%d\12\0"
	.text
	.globl	main
	.def	main;	.scl	2;	.type	32;	.endef
	.seh_proc	main
main:
	pushq	%rbp
	movq	%rsp, %rbp	
	subq	$48, %rsp	

	call	__main	

	movl	$4, %ecx
	call	testa	 
	movl	%eax, %edx
	leaq	.LC0(%rip), %rcx
	call	printf

	movl	$0, %eax

	addq	$48, %rsp	
	popq	%rbp	 
	ret
	.seh_endproc
	.ident	"GCC: (GNU) 7.4.0"

Die Action passiert in Zeile 12-16 und in Zeile 39 bis 43.
 
geht nicht kommt das da:
avr-gcc test.S -o test
ab.c: Assembler messages:
ab.c:4: Error: unknown pseudo-op: `.def'
ab.c:5: Error: unknown pseudo-op: `.seh_proc'
ab.c:7: Error: Unbekannter Befehlscode »pushq«
ab.c:8: Error: Unbekannter Befehlscode »movq«
ab.c:9: Error: Unbekannter Befehlscode »pushq«
ab.c:10: Error: Unbekannter Befehlscode »subq«
ab.c:10: Error: junk at end of line, first unrecognized character is `3'
ab.c:12: Error: Unbekannter Befehlscode »movq«
ab.c:12: Error: junk at end of line, first unrecognized character is `5'
ab.c:13: Error: Unbekannter Befehlscode »cvtsi2sd«
ab.c:14: Error: Unbekannter Befehlscode »cvtsi2sd«
ab.c:15: Error: Unbekannter Befehlscode »mulsd«
ab.c:16: Error: Unbekannter Befehlscode »cvtsd2si«
ab.c:18: Error: Unbekannter Befehlscode »addq«
ab.c:18: Error: junk at end of line, first unrecognized character is `3'
ab.c:19: Error: Unbekannter Befehlscode »popq«
ab.c:20: Error: Unbekannter Befehlscode »popq«
ab.c:22: Error: unknown pseudo-op: `.seh_endproc'
ab.c:24: Error: unknown pseudo-op: `.def'
ab.c:25: Fatal error: unrecognized .section attribute: want a,e,w,x,M,S,G,T



weder mit avr-gcc noch mit gcc klappt es :/

LG
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben