Plain C und Pointer

Danke für dein hilfreiches Statement... :rolleyes: Hier geht es um Lehre und nicht um modernes Programmieren. Gegenfrage: Wie erzeugst du mit C einen beliebig langen Vector ohne Pointer und Verkettete Listen?

Ich habe das absichtlich so zugespitzt formuliert - das ist alles Low-lowel Kram der in Frameworks (für den stinknormalen Ottonormal-Benutzer) besser aufgehoben ist. Die Prinzipien (Arrays,verkettete Listen usw.) lassen sich auch ohne C vermitteln. Aber ich höre schon auf, ja man kann auch in C anständigen Code schreiben, jedoch erfordert es mehr Wissen über die Sprache als in "moderneren" Sprachen.

Ganz nebenbei: ganz so archaisch ist C nicht! ZB Im Embedded- und Automotive-Bereich wird bevorzugt mit C programmiert, da der Footprint der erzeugten Programme kleiner als der von objektorientierten Sprachen mit automatischer Speicherverwaltung ist.

Bin ganz Deiner Meinung, aber ist das für Studenten im Grundstudium von Bedeutung? Wer im Automotive/Embedded Bereich arbeitet und C-Programme schreibt MUSS ein C-Experte sein, alles andere wäre fahrlässig...

Beste Grüße, SMJ
 
gerade das sollte man, weil pointer nun mal mit zum handwerk gehören und da auch die meisten probleme auftreten, weil gerne mal nicht auf null gecheckt wird bevor man den pointer anspringt ;)
deswegen haben neuere sprachen wie java ja keine pointer mehr...

Nö, wie Du schon selber schreibst, gibt es in Sprachen wie Java keine Pointer mehr und der Großteil der Studies die sich da durchquälen müssen benutzen das später niemals wieder und merken sich auch nix davon (ist leider die traurige Realität). Wer seit Jahrzehnten dabei ist und mit C groß geworden ist mag das bedauern.
 
Ich bin auch der Meinung, dass solche Mechanismen direkt vermittelt werden sollten, um zu verstehen, wie andere Programmiersprachen mit diesen Konzepten umgehen (zB. für Java wird jedes Objegt grundsätzlich call by reference adressiert, erst ein expliziter obj.clone() erlaubt call by value)
Wobei anzumerken ist, dass Java kein call by reference bietet. Das ist immer call by value. Nur, dass bei Objekten eben der Pointer statt der Variable kopiert wird. Mag spitzfindig klingen, wenn man aber wirklich mal call by reference anwenden will ist das schon wichtig.
 
oh contrair, haben sie sehr wohl, sie sind bei Objekten nur implizit (siehe oben)! Ein Zugriff auf ein nicht initialisiertes Objekt erzeugt eine NullPointerException!

nicht mehr als sprachkonstrukt, wie das dann implementiert ist für die runtime oder den compiler ist wieder eine andere geschichte.
die compiler für sprachen werden ja bekanntlich meistens nicht in der sprache geschrieben ;)
 
Wobei anzumerken ist, dass Java kein call by reference bietet. Das ist immer call by value. Nur, dass bei Objekten eben der Pointer statt der Variable kopiert wird. Mag spitzfindig klingen, wenn man aber wirklich mal call by reference anwenden will ist das schon wichtig.

Haben wir hier gerade einen unterschiedliches Verständnis von call by reference? Es geht doch darum, wie sich das Programm verhält und nicht was die Java-VM mit den Adressen macht! Ob die Adressen nun hin und her kopiert werden oder mit Referenzen auf Adressen gearbeitet wird, geht in Sachen Java doch etwas weit... (Nachtrag zur Entwirrung: Objekte werden per Referenz adressiert, die Adressen der Objekte aber per Value. Die VM arbeitet als bei Objekten mit call by reference mit der Adresse als Referenzierer!)
 
Zuletzt bearbeitet:
...deswegen haben neuere sprachen wie java ja keine pointer mehr...

Klar gibt es in java Pointer. Jede Referenz auf ein Objekt ist nichts anderes als ein Pointer. Aus diesem Grund ist

Irgendeinobjekt a = ...
Irgendeinobjekt b = ...

if (a == b) ...


etwas ganz anderes als

if (a.equals(b))

Nicht zu vergessen sind auch die schönen Nullpointerexceptions. :kopfkratz:
Was es in Java nicht mehr gibt, ist Pointerarithmetik.

Viele Grüße
Klaus
 
Klar gibt es in java Pointer. Jede Referenz auf ein Objekt ist nichts anderes als ein Pointer. Aus diesem Grund ist

Nicht zu vergessen sind auch die schönen Nullpointerexceptions. :kopfkratz:
Was es in Java nicht mehr gibt, ist Pointerarithmetik.

man sollte mal implementierungen von sprachkonstrukten unterscheiden.
eine referenz zu einem objekt oder eine (fehlende) instanzierung desselben hat wenig gemein mit den adress- bzw inhalts-operatoren in C und deren zugriffsmöglichkeiten auf den gesamten speicher (was du wohl mit pointerarithmetik meinst, wobei die java implementierungen intern bestimmt auch pointerarithmetik bei deren datentypen benutzen)...
 
Haben wir hier gerade einen unterschiedliches Verständnis von call by reference?
Anscheinend, call by reference(c++):
Code:
#include <stdio.h>

void set_var(int &var, int new_value) {
  //var wird als Referenz übergeben
  var = new_value;
}

int main() {
  int a = 0;
  printf("%d\n",a); // 0
  set_var(a, 2);
  printf("%d\n",a); // 2
}
Das ist in Java so nicht möglich. Da in Java Referenzen/Pointer immer kopiert werden, kannst man nicht den Pointer selbst manipulieren, nur das Objekt auf das er zeigt.

Klar gibt es in java Pointer. Jede Referenz auf ein Objekt ist nichts anderes als ein Pointer. Aus diesem Grund ist

Irgendeinobjekt a = ...
Irgendeinobjekt b = ...

if (a == b) ...


etwas ganz anderes als

if (a.equals(b))
Nein, das liegt daran, dass Java keine Operatorüberladung kennt. ;)
 
Zuletzt bearbeitet:
call by reference auf Basisdatentypen sind in Java nicht möglich, richtig. Da muss man dann ein Objekt verwenden, welches den Typen kapselt. Dann sind solche Spielchen auch möglich, die du da treibst...

Code:
public class test {

private static void set_var(MyInt var, int new_value) {
  //var wird als Referenz übergeben
  var.a = new_value;
}

public static void main(String[] argv) {

  MyInt a = new MyInt();
  a.a = 0;
  System.out.println(a.a); // 0
  set_var(a,2);
  System.out.println(a.a); // 2
}

}

class MyInt {

  int a;

}

Edit: Ich schrieb ja, Objekte werden call by reference behandelt.. Was beim Speichermanagement in der VM passiert ist egal, da es keine Auswirkung auf die Programmierung hat.
 
Zuletzt bearbeitet:
War mir irgendwie klar, dass du auf das int anspringst ;) Ich habe das nur als Beispiel genommen weil das einfacher ist(und in c++ auch egal ob man da nun ein int oder sonstwas hat).

Was ich meinte ist, dass
Code:
void set_var(MyClass &var, MyClass new_value) {
  var = new_value;
}
// -- schipp -- pseudocode
print A // --> A
set_var(A, B)
print A // --> B
nicht möglich ist, das wäre call/pass by reference. In Java gibt es einfach keine Möglichkeit von set_var aus A auf ein anderes Objekt zeigen zu lassen.
 
Zuletzt bearbeitet:
nicht möglich ist, das wäre call/pass by reference. In Java gibt es einfach keine Möglichkeit von set_var aus A auf ein anderes Objekt zeigen zu lassen.

Richtig, Adressen austauschen ist nicht möglich, nicht direkt. Mit verlaub, wozu brauchst du sowas? Es mag eine Geschwindigkeitsoptimierung dabei herausspringen, aber der Code und die daraus resultierenden Seiteneffekte sind unabsehbar. Was machst du eigentlich mit dem dann nicht mehr referenzierten Speicher? Wie gibst du ihn wieder frei? (ohne "boost"). Die Referenz dahin ist überschrieben ;)
 
Richtig, Adressen austauschen ist nicht möglich, nicht direkt. Mit verlaub, wozu brauchst du sowas?
Ich habs mal gebraucht(nicht in java sondern python, das hat dasselbe „Problem“), frag mich nicht mehr wozu. Wär sicherlich auch anders eleganter gegangen.

Was machst du eigentlich mit dem dann nicht mehr referenzierten Speicher? Wie gibst du ihn wieder frei? (ohne "boost"). Die Referenz dahin ist überschrieben ;)
Darüber mache ich mir Gedanken, wenn ich mal das Vergnügen habe, eine Sprache ohne Garbage-Collector zu benutzen. ;)
 
Zuletzt bearbeitet:
Schwache Argumente ;) Mit C und C++ 99 ist das mangels Garbage Collector nicht möglich. Boost soll erst Bestandteil einer späteren C++ Version werden. Das zeigt doch deutlich, wie schmutig sowas ist. Es gibt immer einen Weg, das zu umgehen...
 
Nein, das liegt daran, dass Java keine Operatorüberladung kennt. ;)

Richtig, in Java kann man keine Operatoren überladen. Dennoch sind beide von mir genannten Varianten möglich, bedeuten jedoch etwas völlig anderes.

if (a==b)

vergleicht die Referenzen auf Gleichheit, während

if (a.equals(b))

Inhalte der Objekte vergleicht.

Viele Grüße
Klaus
 
Wie groß hätt’ ich den „;)“ denn noch machen sollen :)

Hätte Java Operatorüberladung wäre == garantiert mit equals überladen.
 
re

Hi Leute,

ich wollte mich nur nochmal ganz herzlich für eure Unterstüzung bedanken, dafür ein :upten:.

Zum Glück war nur eine kleine Verständisaufgabe zu Pointern gefragt, ungefähr so

Code:
int a;
int *pt1, *pt2;
pt1 = &a;
*pt1 = 2;
pt1=pt2

Welchen Inhalt haben die Variablen...

Die anderen Aufgaben waren ein vorgefertigtes Programm nach Fehlern durchsuchen und ausbessern - sehr mühsam ohne PC. Ein Programm zur Flächenberechnung eines Zylinders und als krönenden Abschluss ein Programm für einen Kaffeeautomaten welches das Rueckgeld und die Menge der zurückzugebenden 2€, 1€... Münzen berechnet.

Also eigentlich easy doing, so jetzt hoffe ich mal hab ich für den Rest meines Studiums Ruhe vor C.

So jetzt widme ich mich erstmal wieder der Festkörperphysik, da hab ich wenigstens ein bisschen Ahnung davon.

Aber vielen Dank nochmal an alle Beteiligten.

CYA
Flo

EDIT: Hier mal das Programm zur Münzrückgabe, das hat mal wirklich Spaß gemacht sowas zu schreiben :)

Code:
#include <stdio.h>
#include <stdlib.h>
#define Preis 60

int main(){
     int i = 0;
     int j = 0;
     int einwurf; 
	 int rueckgeld;
     int a[8];
	 int b[] = {200, 100, 50, 20, 10, 5, 2, 1};
     scanf("%i", &einwurf);
     rueckgeld = einwurf - Preis;
	 printf("\nAnfangsrueckgeld: %i\n", rueckgeld);
     while (rueckgeld != 0) {
         if (rueckgeld < b[i]) {
			a[i] = 0;
            i++;
            continue;
         }
         else {
              a[i]=rueckgeld / b[i];
              rueckgeld -= a[i] * b[i];
			  printf("\nAnzahl der %i Cent Münzen: %i", b[i], a[i]);
			  printf("\nVerbleibender Betrag: %i", rueckgeld);
			  i++;
         }
     }
	 printf("\n\nAusgabe des Arrays mit Anzahl der einelnen Münzen: \n");     
     while (j < 8) {
           printf("\t %i", a[j]);
           j++;
           }
	return 0;
}
 
Zurück
Oben Unten