Antworten

Der Beitrag verursachte die folgenden Fehler, die behoben werden müssen:
Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.
Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Zusammenfassung

Autor vloki
 - 08.01.2023, 20:13:06 CET
Zitat von: pic18 in 08.01.2023, 19:38:49 CETseltsam, ich habe den C18 Compiler.
Mein Programm macht auf jeden Fall das was es soll :)
Auch Umwege führen nach Rom 8)
Autor pic18
 - 08.01.2023, 19:38:49 CET
seltsam, ich habe den C18 Compiler.
Mein Programm macht auf jeden Fall das was es soll :)

       case ausg_schalthys:
            stdOut_mr =stdOut;
            stdOut = source_lcd;
            
            //printOut("schalthys\n");
            if ((UBAMonitorFast.leistungIst>0) && (pi_alt <20)){
                pi_alt = UBAMonitorFast.leistungIst;
                Te.hour = RCTime.stunden;
                Te.minute = RCTime.minuten;
                printOut(
                        "%bu:%bu",
                        Te.hour, Te.minute);
            }
            if ((UBAMonitorFast.leistungIst)==0 && (pi_alt >4)){    //>4 bei Start auf 5 initialisiert
                pi_alt = UBAMonitorFast.leistungIst;
                Ta.hour = RCTime.stunden;
                Ta.minute = RCTime.minuten;
                minuten = ((int)60*((int)Ta.hour-(int)Te.hour)+Ta.minute-Te.minute);
                printOut(
                            "\t7%bu:%bu\t>%i\n",
                            Ta.hour, Ta.minute,minuten);
                //hex_dec_ausg(minuten);
                //LCD_cr();
                }
            
            stdOut = stdOut_mr;
            break;
Autor vloki
 - 08.01.2023, 16:52:18 CET
Beim C18 sind short und int beide 16bit.

Bei mir funktioniert das mit dem cast auch beim C18 (v3.40) egal wo...
Autor pic18
 - 08.01.2023, 11:24:14 CET
nein, muß immer (int)60 sein. Wobei ich mit jetzt gar nicht sicher bin ob int 2 oder 4 Byte sind. Short sollte nämlich 2 Byte sein. Ich benutze den alten c8? Compiler.
Autor vloki
 - 07.01.2023, 22:35:48 CET
Seltsam, mit dem XC8 bekomme ich es gar nicht hin ein falsches Ergebnis zu bekommen,
egal, ob cast oder nicht.

Was für einen C-Compiler benutzt du?
Autor vloki
 - 07.01.2023, 22:06:10 CET
minuten = (int)xminuten.hour*60 + xminuten.minute;

funzt nicht?
Autor pic18
 - 07.01.2023, 21:59:06 CET
ich habe alle Möglichkeiten ausprobiert, es muß immer die 60 gecasted werden. Alle anderen Operanten sind egal.
Autor vloki
 - 07.01.2023, 21:06:46 CET
Zitat von: pic18 in 06.01.2023, 22:27:12 CETDas Witzige ist, wenn ich vor der 60 (int) weglasse...

Meiner Meinung nach ist das ganz normal. Das Ergebnis einer Operation hat den größten der Datentypen der Operanden, unabhängig davon, welchen Datentyp die Variable hat, in der dieses Zwischen-Ergebnis dann gespeichert wird.

Sind beide 8-Bit, dann wird das Zwischen-Ergebnis eben auch in 8-Bit rein gequetscht und erst danach in einer Variablen mit möglicherweise ausreichend großem Typ gespeichert

Casted man einen der Operanden auf 16-Bit, dann wird auch das Zwischen-Ergebnis mit 16-Bit berechnet...
Autor pic18
 - 06.01.2023, 22:27:12 CET
Das Witzige ist, wenn ich vor der 60 (int) weglasse, dann bekomme ich als Ergebnis 75 jeweils angezeigt. Das ist der Wert des Low-Byte.
minuten = (int)(xminuten.hour*60)+(int)xminuten.minute;// Ergebnis 75, 0x4b anstatt 0x054b
Autor pic18
 - 06.01.2023, 22:17:32 CET
Das hat mir jetzt keine Ruhe gelassen. Ich habe es nochmal mit uint8_t (8 Bit) probiert. Überall vorher habe ich (int) davor geschrieben. Jetzt funktioniert meine printOut() Funktion und meine alternative Funktion.
            if ((UBAMonitorFast.leistungIst)==0 && (pi_alt >4)){    //>4 bei Start auf 5 initialisiert
                pi_alt = UBAMonitorFast.leistungIst;
                xminuten.hour = 22;
                xminuten.minute = 35;
                Ta.hour = RCTime.stunden;
                Ta.minute = RCTime.minuten;
                minuten = (int)(xminuten.hour*(int)60)+(int)xminuten.minute;
            printOut(
                        "\t7%bu:%bu\t>%i\n",
                        Ta.hour, Ta.minute,minuten);
            hex_dec_ausg(minuten);
            LCD_cr();
            }