C (Programmiersprache) – die neusten Beiträge

Was ist der Tastaturpuffer?

Hallo,

Ich lerne gerade C für mein Studium und wir arbeiten mit scanf. Unser Prof hat das Thema Tastaturpuffer aber leider nicht richtig erklärt und ich stehe dementsprechend auf dem Schlauch.

Hier ist die ganze Sache ja noch sehr verständlich.

Eine Zahl wird eingelesen. Diese Eingabe wird mit \n bestätigt. Das in der letzten Zeile eingegeben \n befindet sich in diesem Tastaturpuffer und  wird jetzt automatisch im zweiten scanf eingegeben. Damit wird dieses scanf "Übersprungen" und der Variable "Dummy" das \n  zugewiesen.

EIne Zahl und ein Zeichen wird eingelesen. Wenn jetzt sowohl das Zeichen als auch das \n in dem Tastaturpuffer gespeichert ist, dann müsste ich eine 7 ein A und einen Zeilenumbruch aus Ausgabe bekommen. Das Passiert aber nicht.

Wenn nur das A in dem Tastaturpuffer gespeichert ist, dann müsste ich eine 7 ein A und die möglichkeit erhalten, ein neues Zeichen einzugeben. Das Passiert aber auch nicht.

Stattdessen erhalt ich einfach nur eine 7 und ein A und der Code wird beendet. Warum?

Hier die beiden Codes:

#include <stdio.h>

int main(){

    int Zahl;

    char Dummy;

    printf("geben Sie bitte eine ganze Zahl ein:");

    scanf("%d", &Zahl);                                         .

    scanf("%c", &Dummy);                                        

    printf("%c", Dummy);                                        

    return 0;

}

Und

#include <stdio.h>

int main(){

    int Zahl;

    char Dummy2;

    char Dummy;

    printf("\ngeben Sie bitte eine ganze Zahl und ein Zeichen ein:");

    scanf("%d", &Zahl);                                                 

    printf("%d", Zahl);

    scanf("%c", &Dummy);                                               

    printf("%c", Dummy);                                             

    scanf("%c", &Dummy2);                                                

    printf("%c", Dummy2);

    return 0;

}

Bild zum Beitrag
Computer, Schule, programmieren, C (Programmiersprache)

C++: Kann ich diesen Code irgendwie noch vereinfachen?

Guten Abend,

ich schreibe gerade in C++ an einem kleinen Kniffelspiel. Im Moment bin ich soweit, dass ich mir fünf zufällige Zahlen (Würfel) über die rand()-Funktion erstelle, diese dann in einem Vektor speichere und anschließend über die Funktion auswertung() den höchsten Pasch zurückgebe. Jedoch ist der Code nicht gerade sehr kompakt. Hat jemand Vorschläge für Optimierungen?

Vielen Dank im Voraus!

#include <iostream>
#include <ctime>
#include <vector>
#include <random>

using namespace std;

vector<int> würfe()
{
  vector<int> list; // Ermittelt über die aktuelle Systemzeit 5 Zufallszahlen und übergibt sie dem Vektor list
  srand(time(0));

  for (int i = 0; i < 5; i++) {
    list.push_back(1 + rand() % 6);
    cout << list[i];
  }

  cout << endl;
  return list;
}

int auswertung(vector<int> ergebnis)
{
  int pasch = 0;

  // Verschachtelte for-Schleife iteriert durch Vektor und vergleicht alle Elemente miteinander
  for (vector<int>::iterator it = ergebnis.begin(); it != ergebnis.end(); ++it) {
    for (vector<int>::iterator it1 = ergebnis.begin(); it1 != ergebnis.end(); ++it1) {
      // Nur wenn die Werte gleich sind (Pasch) und nicht auf dasselbe Element zeigen, geht es weiter
      if (*it1 == *it && it != it1) {
        // Nur wenn der gefundene Pasch höher als der Höchste bereits gefundene ist, wird er ausgewertet
        if (*it > pasch) {
          switch (*it) {
            case 1: pasch = 1;
              break;
            case 2:
              pasch = 2;
              break;
            case 3: pasch = 3;
              break;
            case 4: pasch = 4;
              break;
            case 5: pasch = 5;
              break;
            case 6: pasch = 6;
              break;
          }
        }
      }
    }
  }

  return pasch;
}

int main()
{
  int pasch;
  vector<int> random = würfe();
  pasch = auswertung(random);

  cout << "Pasch: " << pasch << endl;
}
Computer, Software, Technik, programmieren, Cplusplus, CC, Code, CPP, Informatik, Softwareentwicklung, Technologie, C (Programmiersprache)

C++ Der Ausdruck muss einen ganzzahligen Enumerationstyp aufweisen?

Was ist hier das Problem?

/   Programm:       Schiefer Wurf
* Filename:       SchieferWurf.cpp
  Autor:       Kai Lauber
* Version: 1.0
* Datum: 25-OKT-2019
  Entwicklungsablauf:
* (Version, Datum, Autor, Entwicklungsschritt)
 1.0, 25-OKT-2019, Kai Lauber, Entwicklungsbeginn 

  Verwendungszweck:
 ‐ Ausgabe der Koordinatenpunkte (x, y) eines Wurfkörpers 
* Beschreibung:     ← Kurzbeschreibung des Programms
 ‐ Das zu erstellende Modul soll die Koordinatenpunkt (x,y) des Wurfkörpers aus den gegebenen Grössen ermitteln und zurückgeben. 	– Anfangsgeschwindigkeit
 – Abschusswinkel 	– Zeit seit des Abwurfes
 
  Precondition:
* ‐ Keine
  Postcondition:
* ‐ Keine
  Folgende Funktionen werden erzeugt:
* ‐
  Copyright (c) 2019 by Kai Lauber

***/

// Bibliotheksfunktion einbinden #include "stdio.h"

// Hauptprogramm int main() {

int v;
int w;
int t;
double x;
double y;
double g = 9.81;


printf("Geben Sie bitte die Anfangsgeschwindigkeit ein: ");
scanf_s("%d", &amp;v);


printf("Geben Sie bitte die Abschusswinkel ein: ");
scanf_s("%d", &amp;w);


printf("Geben Sie bitte die Zeit seit des Abwurfes ein: ");
scanf_s("%d", &amp;t);


int sin = w - w ^ 3 / 6 + w ^ 5 / 120 - w ^ 7 / 5040;


int cos = 1 - w ^ 2 / 2 + w ^ 4 / 24 - w ^ 6 / 720 + w ^ 8 / 40320;


x = v * t * cos;
y = v * t * sin - g / 2 * t ^ 2;


printf("Die Koordinaten sind x = %f und y = %f", x, y);

}

Computer, programmieren, C (Programmiersprache)

SoftwareSerial wie benutzen?

Hallo an die Arduino- Community,

Ich habe mich ja schon sehr viel mit dem Arduino beschäftigt, aber natürlich nicht genug und es ist wahrscheinlich auch nur ein Bruchteil des Möglichen. So genug drum gelabert, zu meiner Frage: Ich benutze die App Blynk zusammen mit dem Arduino Uno, diese muss zum funktionieren eine durchgehende Verbindung zu meinem Serial Port (COM4 in meinem aktuellen Fall) haben, damit die funktioniert. Das bedeutet natürlich, dass ich meinen Seriellen Monitor nicht offen haben kann, da der ja ebenfalls auf den Port zugreifen muss, und nur 1 gleichzeitig geht.

Ich habe aber gehört, ich kann über den SoftwareSerial - Befehl einen zweiten Seriellen Monitor haben... Weiß nur gar nicht, wie der funktioniert, frei hätte ich aktuell die Pins 7 und 8 dafür.

Wie kann ich diesen zweiten Serial erstellen und IHN AUCH ÖFFNEN?

Ich möchte da auf dem Serial2.print nutzen, geht das? (Ich will ihn quasi, wie einen ganz normalen Seriellen Monitor nutzen... Über extra Software geht nichts. Ich habe zumindest schon PuTTY probiert, da öffnet der aber den Port nicht. )

Hier mein bisheriger Code: Blynk braucht halt einen der Seriellen Ports zum funktionieren, was muss ich hier anders machen? (müsst glaube ich nicht zwingend Ahnung von der App haben)

#define BLYNK_PRINT DebugSerial
#include <SoftwareSerial.h>
SoftwareSerial DebugSerial(7, 8); // RX, TX
#include <BlynkSimpleStream.h>
char auth[] = "UnFNS1fIbvFVX8QGBWDoBKah3aWND6dn";
void setup() {   DebugSerial.begin(9600);   Serial.begin(9600);   Blynk.begin(Serial, auth);
//anderer stuff
}
void loop () {
Blynk.run();
//zum Beispiel:
if (Buttongedrückt) {
DebugSerial.println("Button gedrückt");
...stuff
}

MFG Alex - Freue mich auf eure Antworten!

Software, programmieren, Arduino, cmd, C (Programmiersprache), RX, TX, Serielle Schnittstelle

Arduino: millis() als delay() in If-Klause benutzen?

Hi! Ich suche schon lange nach einer Lösung wie ich millis() als delay() benutzen kann. Ich habe einen Bodenfeuchtesensor und ein Relais, das an eine Pumpe angeschlossen wird. Ich möchte, dass das Relais für 10 Sekunden angeht, wenn der Bodenfeuchtesensor einen Wert über 600 ausspuckt. Bisher lautet die If-Klause so:

(siehe unten)

Möchte das aber gerne mit millis() machen. Habe schon viel studiert und probiert, aber keine Lösung gefunden. Nachgelesen habe ich auch. Das Prinzip von millis habe ich verstanden, nur nicht, wie das in einem If-Satz funktioniert.

Vielen Dank für Eure Hilfe!

#include "DHT.h"
#define DHTPIN 12
#define DHTTYPE DHT22

//VENT DELAY//
long schedule_freq = 3200000L;
long schedule_duration = 300000L;


long schedule_timestamp = 0L;
long schedule_timestamp_off = 0L;


bool schedule = false;
//VENT DELAY//


//PUMP//

//PUMP//


const int heatPin = 7;
const int ventPin = 4;
const int pumpPin = 12;


int moist_value = analogRead(A0);

DHT dht(DHTPIN, DHTTYPE);




void setup() {
  dht.begin();
  pinMode(heatPin, OUTPUT);
  pinMode(ventPin, OUTPUT);
}


void loop() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();


  if (t <= 16.0) {
      digitalWrite(heatPin, HIGH);
  }


  if (t >= 25.0) {
    digitalWrite(heatPin, LOW);
  }


  if(moist_value >= 600) {
    digitalWrite(pumpPin, HIGH);
    delay(10000);)
    digialWrite(pumpPin, LOW;
    
    }
    
      if (schedule_timestamp < millis()) {
      schedule_timestamp = millis() + schedule_freq;
        schedule_timestamp_off = millis() + schedule_duration;
        schedule = true;
        //Vent On
        digitalWrite(ventPin, HIGH);
      }
    
    
      if (schedule_timestamp_off < millis() && schedule ) {
      schedule = false;
      //Vent Off
      digitalWrite(ventPin, LOW);
    
    
      }
    
    
    }
Computer, Technik, programmieren, Arduino, Technologie, C (Programmiersprache), If clauses, Arduino Uno, Arduino IDE

Schrittmotor einfach drehen- Arduino?

Seid gegrüßt,

Ich möchte über einen PS2 Controller einfach einen Schrittmotor ansteuern, also sprich ich drücke eine Taste und er dreht solange in diese Richtung, wie die Taste gehalten wird. Nur mit zwei Tasten, für 2 Richtungen, vor und zurück.

Eigentlich Frage: Wie code ich das am Besten?

Also etwa so (mal so erklärend):

if(ps2x.ButtonPressed(PSB_L1)) {
for (drehe dich vorwärts)
solange vorwärts drehen, wie die Taste gehalten wird
}
if(ps2x.ButtonPressed(PSB_R1)) {
for (drehe dich rückwarts)
solange rückwarts drehen, wie Taste gedrückt wird
}

Soweit, so gut. Danke für alle Antworten!

MFG Alex

Hier mein aktueller Code dafür: (ganz unten ist der Part, wo später das mit dem Motor hin soll....)

#include <PS2X_lib.h>  
PS2X ps2x; 
//right now, the library does NOT support hot-pluggable controllers, meaning 
//you must always either restart your Arduino after you connect the controller, 
//or call config_gamepad(pins) again after connecting the controller.
int error = 0; 
byte type = 0;
byte vibrate = 0;
int magenta=2;
int gruen=3;
int blau=4;
int rot=5;
// Stepper Bibliothek hinzufügen
#include <Stepper.h>
// Anzahl der Schritte pro interner Motorumdrehung
const float STEPS_PER_REV = 32; 
// Betrag der Untersetzung
const float GEAR_RED = 64;
// Anzahl der Schritte pro Getriebeausgangrotation
const float STEPS_PER_OUT_REV = STEPS_PER_REV * GEAR_RED;
// Number of Steps Required
int StepsRequired;
// PIN BELEGUNG
// Benutze PINs 8,9,10,11 des Arduinos
// und verbinde diese mit ULN2003 Motor Driver In1, In2, In3, In4 
// Pins, die in der Sequenz 1-3-2-4 für die richtige Schrittsequenzierung eingegeben wurden
Stepper steppermotor(STEPS_PER_REV, 7, 6, 5, 4);
void setup(){
Serial.begin(9600);
error = ps2x.config_gamepad(13,11,10,12, true, true);  //GamePad(clock, command, attention, data, Pressures?, Rumble?) 
if(error == 0){
 Serial.println("Found Controller, configured successful");
 Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;");
 Serial.println("holding L1 or R1 will print out the analog stick values.");
 Serial.println("Go to www.billporter.info for updates and to report bugs.");
}
type=1;
error=0;
pinMode(2,OUTPUT);
pinMode(3, OUTPUT); //gruen
pinMode(4, OUTPUT); //blau
pinMode(5, OUTPUT); //rot
}
void loop(){
 /
error=0;
type=1;
if(error == 1) 
 return; 
if(type == 2){ 
 ps2x.read_gamepad();     //read controller 
}
else {
ps2x.read_gamepad(false, vibrate); //Ab hier beginnt der eigentliche loop, davor nur weil es auch type 2- Controller gibt, hier für den richtigen
if(ps2x.ButtonPressed(PSB_L1){
  --->Hier Motor...
}
delay(50);
} 
}
Computer, Technik, PlayStation, Drehung, Arduino, Technologie, C (Programmiersprache), Schrittmotor, Servo

C++ Programmcode nicht ausführbar "willkommen"?

Guten Abend zusammen,

ich habe mir heute das, Kindle eBook C++ Programmieren für Einsteiger geholt, da mich programmieren schon seit langer Zeit sehr interessiert, ich bisher aber zeitlich nicht dazu kam, mich da einzulesen.

Nun zu der Frage: Ich habe all das, was das Buch mir gesagt hat, durchgeführt:

  1. Einen Text-Editor zum Codes schreiben heruntergeladen: Geany (Schreibe jedoch über den normalen, bereits auf Windows 10 vorhandenen Texteditor).
  2. Einen Compiler für die Erstellung der Programme heruntergeladen: MinGW.

Anschließend kam auch schon die erste Aufgabe. Ich sollte mit einem Kommandozeileninterpreter (cmd / Eingabeaufforderung) die Version des MinGW abfragen. Dies musste ich erst in den erweiterten Systemeinstellungen einstellen, indem ich die Umgebungsvariablen anpasse (in PATH den Dateipfad meines MinGW\Bin-Ordner hinzufügen). Das hat auch funktioniert und ich konnte durch die Eingabeaufforderung die Version meines Compilers abfragen.

Nun geht es los, das erste Programm schreiben: Eine einfache Ausgabe auf dem Bildschirm. Ziel ist es, eine kurze Textnachricht auszugeben.

Nun sind die Schritte wie folgt beschrieben:

  1. Texteditor öffnen
  2. Programmcode eingeben
#include <iostream>

int main()
{
  std::cout << "Willkommen zum C++ Kurs!";
}

Nun soll ich die Datei unter dem Namen willkommen.cpp abspeichern, in meinem Fall auf dem Desktop.

Danach geht es um die Ausführung des Programms: Ich muss das Programm mithilfe des Kommandozeileninterpreters (cmd) kompilieren.

  1. cmd öffnen.
  2. Verzeichnis ändern, in dem Fall auf meinen Desktop

Befehl:

g++ -o willkommen willkommen.cpp

(Ich frage mich, warum ich doppelt willkommen eingeben muss, auch wenn meine Datei nur ein willkommen hat? Ich habe es mit nur einem willkommen probiert und es wurde mir ein Fehler angezeigt!)

Wenn ich das so eingebe, kommt eine oder zwei kurze Sekunden ein Ladevorgang und es passiert weiter nichts. Eigentlich steht in dem Buch geschrieben, dass unter meiner Eingabe in der cmd ein "Willkommen im C++ Kurs " erscheinen sollte. Dies ist leider nicht der Fall.

Also an jeden, der sich mein Problem angeschaut hat: Vielen Dank!

Ich habe auf YouTube und anderen Plattformen nach einer Lösung geschaut, jedoch nichts mit der gleichen Ähnlichkeit gefunden.

Computer, Buch, Technik, IT, programmieren, Informatik, Technologie, C (Programmiersprache)

Meistgelesene Beiträge zum Thema C (Programmiersprache)