KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: Inkrement spinnt
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Ich hab mal versucht den Counter aus den Tuts abzuwandeln... prinzipiell funktioniert er auch, nur ist der Startwert nicht 0 und das Inkrement nicht 1 oô

Woran könnte es liegen?

MfG. mipez

Code:
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>

PSP_MODULE_INFO("Hello World",0,1,1);

#define printf pspDebugScreenPrintf

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
          sceKernelExitGame();
          return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
          int cbid;

          cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
          sceKernelRegisterExitCallback(cbid);

          sceKernelSleepThreadCB();

          return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
          int thid = 0;

          thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
          if(thid >= 0) {
                    sceKernelStartThread(thid, 0, 0);
          }

          return thid;
}


//Main Code


int main() {

pspDebugScreenInit();
SetupCallbacks();
int number=0;
SceCtrlData pad;

printf("Use [X] to start");
while(1) {
          sceCtrlReadBufferPositive(&pad, 1);
          if(pad.Buttons & PSP_CTRL_CROSS) {
    pspDebugScreenClear();
        number+=1;
    printf("Your number is: %i\n",number);
    printf("Use [X] to continue, [O] to exit");
    }
    if(pad.Buttons & PSP_CTRL_CIRCLE){
    sceKernelExitGame();
    }
}

}

Einfach die Code Zeile:

Code:
number+=1;

Mit dieser

Code:
++number

tauschen und es sollte gehen =)

Chaosduckman :
Einfach die Code Zeile:

Code:
number+=1;

Mit dieser

Code:
++number

tauschen und es sollte gehen =)


Leider nicht.
Auch printf("Your Number is: %i/n",number++); hat nix gebracht...

Du solltest am Ende der If-Anweisung noch einen Befehl zum warten, bis die X losgelassen wurde

Code:
while(pad.Buttons &amp; PSP_CTRL_CROSS)
            {sceCtrlReadBufferPositive(&amp;pad, 1);}

mfg D3lta

Ich habe mal sauber gemacht. Dann verschwinden meist die Fehler Big Grin

Code:
int main( void )
{
    int number = 0;

    pspDebugScreenInit();
    SetupCallbacks();

    SceCtrlData pad;

    printf( "Use [X] to start\n" );

    while( !(pad.Buttons &amp; PSP_CTRL_CIRCLE) )
    {
        pspDebugScreenClear();                    //Bildschirm wieder sauber machen
        printf( "Your number is: %i\n", number );
        printf( "Use [X] to continue, [O] to exit" );

        sceCtrlReadBufferPositive( &amp;pad, 1 );    //Buttons holen
        if ( pad.Buttons &amp; PSP_CTRL_CROSS )        //Wenn X gedrückt ist number um 1 erhöhen.
            ++number;

        sceKernelDelayThread( 250 * 1000 );        //Eine Pause mit 250ms.
    }

    return 0;
}

Ok, der aufgeräumte Code sieht eigentlich nicht schlecht aus, nur eine Stelle würde ich noch verbessern

Code:
if ( !(pad.Buttons &amp; PSP_CTRL_CROSS ))
        { //Diese Klammer ist wichtig
        //Wenn X gedrückt ist number um 1 erhöhen.
        //++number, number++ oder number+=1 macht !HIER! keinen unterschied
        //number++ sieht aber mMn besser aus :P
        number++;

        sceKernelDelayThread( 250 * 1000 );        //Eine Pause mit 250ms.

        }//Diese Klammer natürlich auch
    }

    return 0;


EDIT: Da hab ich nicht aufgepasst, jetzt ists wohl richtig Tongue

Nicht ganz mein lieber Wink der Code war schon ok, den wenn nur 1 befehl unter oder hinter einer if anweisung steht benötigt man keine {}
Un was du da jetzt gemacht hast bedeutet das die Pause nur nach drücken von X gemacht wird Wink
Hm das mit dem Delay hat geklappt:
Spoiler: (anzeigen)
Danke an alle.
Wieso schreiben eigentlich die meisten die geschweiften Klammern direkt ohne Neuzeile?

Ich finde, dass

Code:
while(...)
{    
    if(...)
    {
        // blaaaaa
        // blaaaaa
    }
    else
    {
        // blaaaaaa
        // blaaaaaa
    };
    
    if(...)
        // blaaaa
    
    // blaaaaaaaa
    // blaaaaaaaa
    // blaaaaaaaa
};


viel übersichtlicher aussieht als

Code:
while(...) {
if(...)    {
    // blaaaaa
    // blaaaaa
}
else {
    // blaaaaaa
    // blaaaaaa
};

if(...)
    // blaaaa

// blaaaaaaaa
// blaaaaaaaa
// blaaaaaaaa
};

Ich finde es auch ohne Neuzeile übersichtlich genug, doch das ist Ansichtssache, außerdem geht es ohne doppelte Newlines schneller und der Source wird nicht so lang...

mfg D3lta

D3lta :
Ich finde es auch ohne Neuzeile übersichtlich genug, doch das ist Ansichtssache, außerdem geht es ohne doppelte Newlines schneller und der Source wird nicht so lang...

mfg D3lta


1. Bei sehr langen und komplizierten Codes, wird der Code fast unlesbar.
2. Lieber ein langer Source, als ein nicht gut formatierter.

JA HackmaN da hast du zwar recht aber genauso wie es Links und Rechtshänder gibt die alle unterschiedlich schreiben gibt es halt auch bei C unterschiedliche Schreibweisen Wink
Ich sag nur jeder wie er es Mag Hauptsache es ist für einen Lesbar ;P

Ich Persönlich habe es so gelernt

Code:
if (..) {
     //......
}

aber mache es auch meistens so:

if (..)
{
     //......
}

Naja ist halt alles Ansichtssache Wink

Meistens wenn ein Code lang ist teil ich mir auch die einzelnen Code Abschnitte ein durch

//-------------------------------------------------------------------------------

Edit an HackmaN:

Ja das gute alte

/* ......... */

mach ich auch manchmal noch aber da finde ich einfach // ...... bequemer Wink

Naja, bei mir ists ne Mischung aus "neuem" und "altem" Stiel...

ich schreib zwar alles mit Neuzeile und packe niemals mehrere Funktionen in eine Zeile (wie es heutzutage meistens gemacht wird), mache aber immer noch die (inzwischen nicht mehr nötigen) Semikolons ans Ende eines Blocks (früher Standart), also z.B.

Code:
if(...)
{
    // blaaa
} // hier kein Semikolon, weil ein else folgt
else
{
    // blaaa
}; // Semikolon macht deutlich, dass kein Else mehr folgt


Inzwischen wird dieses Semikolon von modernen Compilern ignoriert, aber ich habs so gelernt und mache es auch so weiter Wink

Bei kleinen Codes ist das mit der Neuzeile ja auch nicht so schlimm, aber bei langen Codes wird es echt total unleserlich.

Auch mach ich (außer bei so Beispiel Codes wie oben) fast nie die in C++ neuen Kommentare (//, inzwischen gibts die in C ja auch), sondern benutz' am liebsten die standart-C Kommentare, z.B.

Code:
/*
* Blaaaaaaa
*/
u16 make_blaaaa(u32 bla1, u16 *bla2)
{
    /* blaaaaaaa */
    if(bla1 == 0x12345678)
    {
         /* BLABLABLA */
         bla1 = _lw(bla2 + 0x5);
    };
    
    return bla2[0x4321];
};

Ceikor :
Nicht ganz mein lieber Wink der Code war schon ok, den wenn nur 1 befehl unter oder hinter einer if anweisung steht benötigt man keine {}
Un was du da jetzt gemacht hast bedeutet das die Pause nur nach drücken von X gemacht wird Wink


Ist das denn ein Problem, dass die Pause nur nach dem X drücken gemacht wird? Auf dem PC ist das kein Problem und ehrlich gesagt hab ich mich mit der PSP nicht so auseiander gesetzt. Ich dachte nur daran, dass die dann schneller reagiert.
Und das ohne Klammern finde ich einfach unübersichtlich, mit Klammern erkennt man das besser was alles drin steht.

@HacKmaN

Ich schreibe eigentlich auch wie dein zweites Beispiel also

Code:
if (x==1) {
      //irgentetwas
}
else {
      //was anderes
}


Und da ich immer gleichweit einrücke sieht man sehr gut, welcher Code in welchen Block gehört. Ich hab das in meinem Java Buch so gelernt, und vorher in C++ anders, fand das von Java aber übersichtlicher.

Hi,

dein Problem ist, dass bei jedem Schleifendurchlauf der Button-Wert gelesen wird....das heißt dass du den X-Knopf gar nicht schnell genug loslassen kannst, dass er nur um 1 hochzählt....

Eine sehr bewährte Methode um das zu umgehen ist folgende:

[code]
SceCtrlData pad, lastPad;
while (1){
sceCtrlReadBufferPositive( &pad, 1 );
if (pad.buttons != lastPad.buttons){
if (pad.buttons & PSP_CTRL_CROSS){
Seiten: 1 2
Referenz-URLs