Seite 1 von 3
Variablen in C - Progger, leiht mir euer Brain
Verfasst: 21 Mai 2005, 05:17
von Clow Leed
Also: Ich bastle grad an einem Program in dem eine globale Variable
benötigt wird.
Zuerst eine Erklärung:
ham_DrawText(x,y,z); läßt einen Text anzeigen.
x = Offset an X Achse
y = Offset an Y Achse
z = "Hallo, Welt!" (ein String)
Die Variable heißt :
SelectState und soll eine 8-bit Varia sein.
Der Inhalt fließt in eine If-Schleife wie in diese:
Code: Alles auswählen
if (SelectState == 0);
{
ham_DrawText(23,2,"(-");
ham_DrawText(23,3," ");
ham_DrawText(23,4," ");
}
Es liegen 2 dieser Schleifen untereinander wie hier:
Code: Alles auswählen
if (SelectState == 0);
{
ham_DrawText(23,2,"(-");
ham_DrawText(23,3," ");
ham_DrawText(23,4," ");
}
if (SelectState == 1);
{
ham_DrawText(23,2," ");
ham_DrawText(23,3,"(-");
ham_DrawText(23,4," ");
}
Es wird alles compliliert ohne Probs, doch wenn das Programm führt beide Schleifen aus.
Das heißt das
(- springt auf und ab, was es nicht soll.
Ich hab jetzt schon fast alles ausprobiert, es geht nicht wie ich es will.
Verfasst: 21 Mai 2005, 19:09
von smashIt
ich würd mal sagen ; hinter den if-anweisungen gehört weg

Verfasst: 22 Mai 2005, 00:02
von Clow Leed
Argh, stimmt ja das macht man glaub ich in Javascript so...
Und wie bastle ich Variablen in denen Strings stehen?
Weil statt "lol" bekomm ich immer "6C656C".
Und statt 100 (in dezimal) bekomm ich immer 64 (in hex).
Ich hab jetzt nämlich rausgefunden, wie man den Inhalt einer Varia
anzeigt.
(2,2,%2x,SelectState);
Verfasst: 22 Mai 2005, 00:58
von smashIt
variablen in denen strings stehn kannst dir ganz brutal über n char-array basteln. is aber nicht die feine englische art.
schreibst eigentlich in reinem c oder c++?
wenn c++ gibts dafür schon unzählige libraries mit vorgefertigten string-klassen und dazugehörigen i/o-funktionen. nachdem ich aber das bischen was ich geproggt hab in beos gemacht hab und da schon ne sehr gute auswahl von be mitgelifert wurde kann ich dir da leider nicht weiterhelfen.
aber ich bin sicher das schon das notwendigste bei deinem compiler dazugepackt is
----------EDIT----------
du sagst es sei ne 8-bit variable verwendest aber nur 0 udn 1, da würd sich bool besser eignen.
weil du dann einfach if(var)blablabla else balblaba machen kannst
wennst alle werte von 0 bis x brauchst würd sich n switch anbieten statt unzähligen ifs hintereinander
Verfasst: 22 Mai 2005, 14:08
von Panther
Clow du brauchst "%s" um einen String auszugeben. "%x" gibt eine Hexadezimalzahl aus... Ließ dir mal die Docu zu printf durch.
Die korrekte Lösung für die Ifs sieht so aus (unter Annahme das 0 oder irgendwas anderes):
if (!SelectState) {
// Hier kommt der =0 Block
} else {
// und hier der Rest
}
Verfasst: 22 Mai 2005, 18:49
von Clow Leed
Mittlerweile sieht es bei mir so aus:
Code: Alles auswählen
if(F_CTRLINPUT_R_PRESSED)
{
ham_DrawText(1,2,"04000120 : xxxx");
ham_DrawText(1,3,"04000122 : xxxx (SCD1)");
ham_DrawText(1,4,"04000124 : xxxx (SCD2)");
ham_DrawText(1,5,"04000126 : xxxx (SCD3)"),
ham_DrawText(1,6,"04000128 : xxxx");
ham_DrawText(1,7,"0400012A : xx");
ham_DrawText(1,8,"04000134 : xxxx");
//ham_DrawText(1,9,"020000b2 : xx");
ham_DrawText(1,18,"Refresh ");
}
if(F_CTRLINPUT_L_PRESSED)
{
*(volatile unsigned short *)(0x0400012A) = *(volatile unsigned short *)(0x04000120);
ham_DrawText(1,18,"Looping ");
}
if(F_CTRLINPUT_UP_PRESSED)
{
*(volatile unsigned short *)(0x04000128) = 0x608b;
*(volatile unsigned short *)(0x04000134) = 0x0000;
ham_DrawText(1,18,"Fake BIOS Wait");
}
//After Multiboot Reset
if(F_CTRLINPUT_DOWN_PRESSED)
{
*(volatile unsigned short *)(0x04000122) = 0xFF;
*(volatile unsigned short *)(0x04000128) = 0x508c;
*(volatile unsigned short *)(0x0400012A) = 0xFF;
*(volatile unsigned short *)(0x04000134) = 0x000A;
ham_DrawText(1,18,"Reset GBA ");
}
//Cycle SIOMLT_SEND
if(F_CTRLINPUT_RIGHT_PRESSED)
{
g_SIOSend++;
*(volatile unsigned short *)(0x0400012A)= g_SIOSend;
ham_DrawText(1,18,"SIO_SEND: %4x",*(volatile unsigned short *)(0x0400012A));
}
Wo find ich die Docu zu printf bei HAM scheint eine beizulegen,
aber geht nicht.
@SmashIt:
Es ist reines C (C++ = *örk*) für die GBA-Hardware...
Wie bau ich nen
switch? So oder anders?
Code: Alles auswählen
switch (g_Mem){
case 0x200:
ham_DrawText(1,2,"lol1\n");
break;
case 0x2000:
ham_DrawText(1,2,"lol2");
break;
case 0x8000:
ham_DrawText(1,2,"lol3");
default:
ham_DrawText(1,2,"No lol - fail");
}
Verfasst: 22 Mai 2005, 20:15
von smashIt
jupp so sieht n switch aus (wenn mich mein gedächtnis nicht grad verarscht)
soweits sinn macht kannst break übrigens weglassen um mehrere blöcke auszuführen.
finds übrigens toll das für ne "console" was schreibst
und wegen c++=*örk*: schon mal java probiert? *örkörk*
Verfasst: 22 Mai 2005, 20:15
von Panther
Oha lernst du eigentlich programmieren ohne dir ein gutes Buch über die Programmiersprache deiner Wahl besorgt zu haben?
Hier man ein online gefundenes:
http://publications.gbdirect.co.uk/c_book/
Ansonsten ist dein switch fast richtig. Nur VOR dem default fehlt das break. Somit würde im letzten Fall auch der default-Zweig durchlaufen.
Aber wenn du fürn GB coden willst lern ARM-Assembler und vergiß C ganz schnell...
Verfasst: 23 Mai 2005, 00:59
von Clow Leed
Ich bring mir grad selbst C bei - learning by doing.

Alles weitere hol ich mir aus den Samples die beiliegen.
Nur einige Sachen stehen da auch nicht drin.
Zum Beispiel wie man das Program anhält.
Ich hab schon stop, wait, hold, pause versucht, aber geht nich.
Wie halte ich kurz an?
break bricht ja eine Schleife ab.
Kann man mit while() auch ne warteschlange machen? Wie?
@Panther:
VisualHAM macht glaub ich C/C++ -> ASM (Oder ARM)
Verfasst: 23 Mai 2005, 01:20
von Panther
Clow Leed hat geschrieben:Ich bring mir grad selbst C bei - learning by doing.

Alles weitere hol ich mir aus den Samples die beiliegen.
Nur einige Sachen stehen da auch nicht drin.
Genau deshalb benutzt man dazu ein einführendes Buch
Zum Beispiel wie man das Program anhält.
Ich hab schon stop, wait, hold, pause versucht, aber geht nich.
Wie halte ich kurz an?
break bricht ja eine Schleife ab.
Das kann C überhauptnicht. Dafür brauchst du irgendeine API-Funktion des Betriebssystem. Kenn ich auf dem GB nicht. Sollte aber irgendwo angegeben sein. Unter Unix heißt die Funktion sleep(x)
Kann man mit while() auch ne warteschlange machen? Wie?
Kann man ist aber übelster Stil und funktioniert nicht wirklich gut.
@Panther:
VisualHAM macht glaub ich C/C++ -> ASM (Oder ARM)
Ja ist ja die Aufgabe eines Compilers

Nur ist direkt von Hand geschriebenes Assembler meistens deutlich kompackter und schneller, da man von Hand ganz andere Optimierungen nutzen kann als der Compiler (er weiß ja nicht was man will).