Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
11.12.2002, 16:30
Retro



Nabend, meines Wissens nach gibt es in C keine Möglichkeit einen IF-Block vorzeitig zu verlassen, stimmt das?

Quellcode:int main(void)
{
    for (;;)
    {
        if (ereignis)
        {
            if (gna = 1)
            {
                ausgabe = "eins";
                break; // <-- verlässt die ganze schleife
            }

            if (gna = 2)
            {
                ausgabe = "zwei";
                break; // <-- verlässt die ganze schleife
            }
        }
    }
}

Nur nen kleiner Beispielcode. Wenn z.B. "gna" gleich 1 ist wird der passende Zweig betreten... Dannach soll aber aus dem IF-Block (ereignis) zurück in die Endlosschleiffe gesprungen werden.

Wenns nicht geht muss wohl else-if ran... Währe mir aber lieber irgendwie aus dem IF zu entkommen.

/Edit
Sorry, sollte eigentlich ins Coding-Board, zu spät bemerkt...

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */


Dieser Beitrag wurde am 11.12.2002 um 16:32 von Retro bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
11.12.2002, 17:40
Prefect



1. In den if()-Expressions macht gna == 1 (doppeltes =) und gna == 2 einiges mehr Sinn.

2. Rein prinzipiell wäre das mit einem goto möglich. In deinem Fall ist ein else if() aber definitiv besser.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
11.12.2002, 17:45
Tron



continue

aber ein for(;;) stinkt meistens nach ueblem hack und falls man den entfernt loest sich auch das if-problem...

<syntax-jurist>das mit dem = hat ja prefect schon gesagt, zudem sollte dein main am ende ein return 0; haben</syntax-jurist>

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
003
11.12.2002, 18:06
Fraghunter



ne, continue ist doch falsch, dann macht er das ja gleich nochmal...

dein Beispiel sollte z.B. aber auch so gehen:
Quellcode:
do{
   if (ereignis){
      if (gna == 1){
         ausgabe = "eins";
         checker = true; // <-- verlässt die ganze schleife
      } else if (gna == 2){
         ausgabe = "zwei";
         checker = true; // <-- verlässt die ganze schleife
      }
   }
}while (!checker)

--

Nihil timeo, nulla re opprimor, nulli periculo cedo.
www.TheDoenerKing.de


Dieser Beitrag wurde am 11.12.2002 um 18:08 von Fraghunter bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
11.12.2002, 18:06
Retro



Ists schon aufgefallen dass die Variablen garnicht deklariert sind? :) Ist sowieso nur preudocode...

Die Endlosschleife ist kein Hack sondern des Fundament meines Programmes (Mikrocontroller-Programm). Das mit dem Goto gefällt mir ganz und garnicht, läufts wohl wirklich auf nen "else if" hinaus...

"continue" ist doch ebenso für Schleifen konzipiert? Bzw. scheint es beim IF immer wieder an den Anfang zu gehen, das geht aber auch nicht, denn nach dem "Ereignis-IF" kommt noch Coder der auch nach vorzeitig abgebrochenen IF sofort ausgeführt werden soll...

/Edit
Die Endlosschleiffe _darf_ auf garkeinen Fall verlassen oder abgebrochen werden, das käme einen Absturz gleich!

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */


Dieser Beitrag wurde am 11.12.2002 um 18:08 von Retro bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
11.12.2002, 18:08
Tron



@Fraghunter:
wlkikiv

Zitat:
Nur nen kleiner Beispielcode. Wenn z.B. "gna" gleich 1 ist wird der passende Zweig betreten... Dannach soll aber aus dem IF-Block (ereignis) zurück in die Endlosschleiffe gesprungen werden.

@Retro:
dann nimm switch! (ausser du pruefst nicht native datentypen)

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 11.12.2002 um 18:10 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
11.12.2002, 18:15
Retro



Mh, ich bemerke, scheiss Beispiel...

Ich frage nicht den Wert _einer_ Variable ab sondern habe halt sehr viele IFs untereinander die alle etwas anderes überprüfen... Switch ist nicht drinne.

Um das ganze mal zu einem sinnvollen Ende zu bewegen, es scheint mir allmählich so, dass es wirklich keine Fluchtmöglichkeit aus einem IF gibt?

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
007
11.12.2002, 18:25
Tron



tja, dann bleibt nur if {} else if {} ...

was heisst eigentlich ereignis? kommt da einfach was auf einem ports rein und du liest was da anliegt?
kannst du ein etwas realitaetsnaeheres beispiel geben?

<neugier>
auf was fuer hardware macht man das heutzutage? benutzt man noch den guten alten Z80?
was wird es, wenn es fertig ist? (oder hast du nen NDA unterschrieben?)
</neugier>

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
008
11.12.2002, 18:45
Fraghunter



mhhh

nein, aus einem IF kannst du nicht fliehen, aber mach das doch einfach so:
Quellcode:
while(eigentliche If-Bedingung){
   was_auch_immer;
   break;
}

--

Nihil timeo, nulla re opprimor, nulli periculo cedo.
www.TheDoenerKing.de

zum Seitenanfang zum Seitenende Profil || Suche
009
11.12.2002, 20:13
apfelkorn



ýarks (mit ausländischem akzent *g*):
@Fraghunter: Das ist ja wohl das leetischste Stück Code was ich seit langem gesehen habe. Du provozierst nur so die logschen Fehler.

@Retro: Ich versteh überhaupt nicht wo dein Problem liegt. Genau für solche Fälle ist ein else if vorgesehen.

--

zum Seitenanfang zum Seitenende Profil || Suche
010
11.12.2002, 20:18
Fraghunter



mhhh
es ist aber die einzige Möglichkeit ein If zu verlassen, und ich wüsste nicht, was daran nicht funktionieren sollte.

--

Nihil timeo, nulla re opprimor, nulli periculo cedo.
www.TheDoenerKing.de

zum Seitenanfang zum Seitenende Profil || Suche
011
15.12.2002, 01:36
Retro



Ja apfelkorn, dann sind es rund 100 verschachtelte IFs :)

@Tron
Also der Z80 ist schon länger nichtmehr aktuell, die 8051-Familie hält sich noch ganz wacker, ansonsten haben auf dem Gebiet der Steuerungstechnik die AVRs und PICs den Markt ansich gerissen. Im Mittelfeld hat sich die Leistung sehr nach oben verbessert, mit einem 16Bit M16C80 von Mitsubishi bin ich grade dabei ein 800x600 TFT-Display anzusteuern... Das schafft der spielend (natürlich mit LCD-Controller zwischengeschaltet). Auf den oberen Plätzen dreht sich alles um die neuen Controller mit ARM-Struktur... Fast jeder Hersteller hat nachgelegt und eine eigene ARM-Serie am Start. Ich hab mal ein Sample von Xilinx in den Fingern gehabt welches mehr als 800MIPS bei nur 40MHz geschafft hat, unglaublich. Videobearbeitung ist mit einem 64Bit breiten Bussystem auch garkein Thema mehr...
Aber auch erwähnte AVRs dringen immer mehr in den Mittelbereich ein, haben fast alles intus und sind verdammt vielfälltig aber dennoch einfach! Bei 16MHz, 16MIPS und 256kB Flash liegen dann aber die Grenzen.

Da dass was ich jetzt fummele eher etwas distanziert von dem ganzen Projekt ist, kann ich auch ruhig Auskunft geben... Es geht immer noch um die Matrixtastatur, komplexer als ich gedacht habe. Jetzt sollen/müssen noch ein paar Funktionen umgeschrieben und hinzugefügt werden, der Controller auf dem ich das ganze entwickele hat "nur" 8kB Flash, ich kann auch nicht wechseln da dies der einzigste Controller mit 35 IO-Pins ist welcher mit akzeptabler Geschwindigkeit für hohe Baudraten arbeite... Die 35 Pins sind übrigens restlos (!!) verbraten, auch immer ein gefährliches Spiel, zum Glück hab ich schon voher dran gedacht und einen I²C-Bus parat gehalten...

Die Lösung die am besten vom Compiler übersetzt wird ist wirklich die mit den 101-IFs. Bei jedem Durchlauf muss zwar jedes IF abgefragt werden (Im Nein-Fall 4 Zyklen), aber bei 8MHz und 8MIPS stört das nicht, der Counter mit nachfolgendem 1of12-Dekoder ist auf 6kHz getaktet..
Wenns dich interessiert kann ich dir ja mal den Schaltplan und die Software zukommen lassen... Ist zZ. sowieso erst auf dem Breadbboard aufgebaut ;)

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche
012
15.12.2002, 13:16
TheTinySteini



Ja, die Häufung von IFs ist sicher nicht die am schönsten aussehende Lösung, aber vermutlich die einzig akzeptabel schnelle. Ich denke du kannst noch ganz gut optimieren, wenn du die statistisch am öftesten auftretenden Fälle ganz nach oben nimmst - falls du das nicht sowieso schon getan hast oder alle Fälle gleich oft auftreten.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche