Show Posts
Pages: 1 [2] 3 4 ... 164
16  International / Deutsch / Re: BMP085 - Pin Belegung? | Verzweiflung on: April 15, 2014, 02:04:44 pm
Kann mir bitte jemand von euch helfen und mir sagen wo man die Pinverteilung ändert?

Deja-vu: http://forum.arduino.cc/index.php?topic=233533.0

Zwei Tage später, dasselbe Thema zum Zweiten.
Und das vom selben Themen-Starter.
 smiley-cry
17  International / Deutsch / Re: Lcd-Problem on: April 15, 2014, 11:03:43 am
Hier ein Foto vom kompl. Aufbau:

Sieht das auf dem Foto nur so aus oder führen die beiden Außenanschlüsse des Kontrast-Potis beide zu GND?
18  International / Deutsch / Re: Lcd-Problem on: April 15, 2014, 10:38:50 am
Ich habe mir mal testweise einen ATMEGA328 mit einem LCD (HD44780 Controller) zusammengesteckt.
Das funktioniert im Prinzip, ABÈR:
Das Display produziert "verwaschene" Schrift.
Weiß jemand Rat?

Fehlerhafte Schaltung.
Irgendwie sieht Dein Foto aus als wenn Du vergessen hast, die Hintergrundbeleuchtung anzuschließen - die ist aus.

Alle LCDs mit weißen Pixeln brauchen zur einwandfreien Funktion zwingend eine Hintergrundbeleuchtung.

Dagegen ist bei Displays mit schwarzen Pixeln die Hintergrundbeleuchtung optional: Funktioniert ohne wie auch mit.

Des weiteren frage ich mich: Wo ist denn bei Deinem Display das Potentiometer für die Kontrastregelung?
19  International / Deutsch / Re: Blinker für RC-Auto on: April 15, 2014, 07:19:17 am
Später, wenn alles funktioniert, soll das ganze in dem RC-Fahrzeug über einen Multiswitch gesteuert werden. Dieser gibt wie ein Taster nur bei betätigung des entsprechenden Schalters auf der Fernbedienung ein Signal für den jeweilien Kanal aus.
Wenn der Blinker aus ist und gedrückt wird soll er angehen bis wieder gedrückt wird, dann geht er wieder aus.

OK, es kann jetzt sein, dass ich da etwas verwechselt habe, was für ein Signal Du später auswerten möchtest. Ich war davon ausgegangen, Du wolltest mit dem Arduino direkt am RC-Empfänger die Impulse auswerten und danach schalten. Offenbar möchtest Du aber tatsächlich zwischen RC-Empfänger und Arduino noch einen Multiswitch-Decoder dazwischenstecken, der Dir ein bereits decodiertes Signal liefert.

Ich finde es immer schön, wenn ein Programm nach dem EVA-Prinzip strukturiert wird:
- Eingabe
- Verarbeitung
- Ausgabe

Da bei diesem Programm nicht viel zu tun ist, habe ich den Schritt "Verarbeitung" hier mal der "Eingabe" mit zugeschlagen.

Beispiel-Code (ungetestet) anbei.
Code:
// Blinker Demo by 'jurs' for German Arduino Forum
#define INPUT_TYPE INPUT_PULLUP  // INPUT oder INPUT_PULLUP
#define BLINKTAKT 500   // in Millisekunden
#define ENTPRELLZEIT 5  // in Millisekunden
byte tasteLinks=2;  // Pins für zwei Taster
byte tasteRechts=3;
byte blinkerLinks=12; // Pins für zwei Blink-LEDs
byte blinkerRechts=13;

boolean linksBlinken=false; // Blinker links gesetzt
boolean rechtsBlinken=false; // Blinker rechts gesetzt

void blinkEingabe()
{
  static unsigned long lastMillis=0;
  static boolean altTasteL=false;
  static boolean altTasteR=false;
  if (millis()-lastMillis<ENTPRELLZEIT) return;
  lastMillis=millis();
  boolean neuTasteL=digitalRead(tasteLinks);
  boolean neuTasteR=digitalRead(tasteRechts);
  if (INPUT_TYPE==INPUT_PULLUP) // vertauschte Tastenlogik bei PullUp
  {
    neuTasteL=!neuTasteL;
    neuTasteR=!neuTasteR;
  }
  if (neuTasteL==HIGH && altTasteL==LOW) linksBlinken=!linksBlinken;
  if (neuTasteR==HIGH && altTasteR==LOW) rechtsBlinken=!rechtsBlinken;
  altTasteL=neuTasteL;
  altTasteR=neuTasteR;
}

void blinkAusgabe()
{
  static unsigned long lastMillis=0;
  static boolean onTakt=false;
  static unsigned long diffMillis=0;
  unsigned long nowMillis=millis();
  diffMillis+=nowMillis-lastMillis;
  if (diffMillis>=BLINKTAKT)
  {
   diffMillis=0;
   onTakt=!onTakt;
   if (onTakt && linksBlinken) digitalWrite(blinkerLinks,HIGH);
   else digitalWrite(blinkerLinks,LOW);
   if (onTakt && rechtsBlinken) digitalWrite(blinkerRechts,HIGH);
   else digitalWrite(blinkerRechts,LOW);

   Serial.print(digitalRead(blinkerRechts));
   Serial.print(digitalRead(blinkerLinks));
   Serial.println();
  }
  lastMillis=nowMillis;
}


void setup() {
  Serial.begin(9600);
  pinMode(tasteLinks,INPUT_TYPE);
  pinMode(tasteRechts,INPUT_TYPE);
  pinMode(blinkerLinks,OUTPUT);
  pinMode(blinkerRechts,OUTPUT);
}

void loop()
{
  blinkEingabe();
  blinkAusgabe();
}

Je nachdem, ob Du Deine Taster mit PullDown-Widerständen angeschlossen hast oder die internen PullUps des Atmega an den Tastern verwenden möchtest, kannst Du den INPUT_TYPE als entweder "INPUT" oder "INPUT_PULLUP" definieren, abhängig von Deiner Schaltung.

Beide Blinker werden übrigens unabhängig voneinander geschaltet, so dass sich Warnblinken schalten läßt, indem man sowohl den linken als auch den rechten Blinker einschaltet. Also diese Schaltlogik entspricht nicht der Straßenverkehrszulassungsordnung.

Die "Serial" Befehle habe ich übrigens nur zum Debuggen für die Programmentwicklung drin, um mir hier keine Taster und LEDs tatsächlich aufbauen zu müssen, die "Serial" Befehle kannst und solltest Du natürlich für das engültige Programm rauslöschen.
20  International / Deutsch / Re: Blinker für RC-Auto on: April 15, 2014, 04:03:27 am
Beim betätigen von pin 3 (Schalter Rechts) beginnt LED 6 (Blinker Rechts) zu blinken. Beenden lässt sich dies über ein erneutes betätigen des pin 3 nicht.

Als erstes mal müßtest Du Dir über die genaue Schaltlogik im Klaren werden.
Oben schreibst Du einerseits von RC-Kanälen, über die Steuerinformationen gesendet werden
Dann schreibst Du von Tastern, die beim Betätigen mal ein- und mal ausschalten sollen

Meine Kenntnisse über RC-Fernsteuerungen sagen mir: Eine Funktion wird geschaltet, so lange ein Steuersignal gesendet wird, das besagt, die Funktion soll geschaltet sein. Wenn Du dieses RC-Verhalten mit einer Taster-Logik nachbilden wolltest, wäre die Logik (bei einer RC-Fernsteuerung wie ich sie kenne):
- RC-Funktion geschaltet / Taster ist runtergedrückt ==> zugehöriger Blinker blinkt
- RC-Funktion nicht geschaltet /Taster ist losgelassen ==> Blinker ist aus
Für diese Art Steuerung wird ein RC-Kanal für jede Steuerfunktion benötigt.
Bzw. ein RC-Kanal für insgesamt zwei Steuerfunktionen, von denen aber nur eine zur Zeit gesetzt sein kann (links-rechts-aus).

Daneben gibt es noch "Multiswitch" Schaltlogik, bei der ein Kanal in verschiedene Schaltfunktionen aufgeteilt wird und im Endeffekt ist es so, dass es für jede Schaltfunktion einen verschiedenen Schalter zum Ein- und Ausschalten gibt:
- RC-Funktion für  EIN geschaltet / Taster EIN wurde gedrückt ==> zugehöriger Blinker blinkt
- RC-Funktion für AUS geschaltet / Taster AUS wurde gedrückt ==> Blinker ist aus
Mit einem Multischwitch, können dann z.B. fünf verschiedene Funktionen pro RC-Kanal ein/aus geschaltet werden, das entspricht fünf Einschaltern und fünf Ausschaltern, wenn man es mit Schaltern nachbilden möchte: Je ein Einschalter und ein Ausschalter pro Funktion.

Und Du möchtest stattdessen diese Logik haben, die nicht so wirklich RC-kompatibel ist:
- RC-Funktion wird einmal geschaltet / Taster wird einmal runtergedrückt ==> zugehöriger Blinker blinkt
- RC-Funktion nicht geschaltet / Taster ist losgelassen ==> bereitmachen für nächstes Kommando
- RC-Funktion wird nochmal geschaltet / Taster wird nochmal runtergedrückt ==> Blinker ist aus
???
21  International / Deutsch / Re: Ghosting´s auf Adafruit 2.8" TFT V2 on: April 15, 2014, 02:53:52 am
Ist es möglich, das sich da nach ca. 3 Wochen Ghosting´s auf/in dem Display
bilden? Früher nannte man das "einbrennen"- will ich aber beim TFT nicht
so recht glauben.

http://de.wikipedia.org/wiki/LCD-Memory-Effekt

Der Memory-Effekt verschwindet, wenn Du den Monitor entweder sehr lange Zeit ausschaltest, oder wenn Du genau so lange ein weißes Bild zeigst wie es vorher gedauert hat, durch Zeigen desselben Bildes den Memory-Effekt hervorzurufen.
22  International / Deutsch / Re: Editieren / anschauen von .h und .c dateien in der library on: April 14, 2014, 09:33:51 am
Dass das mit einem externen Editor geht ist schon klar - hatte ich ja auch geschrieben.
Aber was macht denn eine IDE (heisst ja schliesslich Integrated Development Environment...)
für einen Sinn, die neben dem eingebauten noch einen externen Editor benötigt
um Dateien zu bearbeiten die innerhalb eines Projektes benutzt werden wie
cpp und header-files) ???

Die "Arduino-Software" ist eben hauptsächlich für Leute gemacht, die nur "Sketche" editieren und Libraries nur wie fertige Lego-Bausteine "benutzen" möchten, aber keine Libraries "selber schreiben" wollen. Die aufgeräumten und eingeschränkten Funktionen in der IDE verhindern jedenfalls, dass Leute ohne die geringste Ahnung sich ihre Libraries kaputt bearbeiten.

Wenn Du eine umfangreichere IDE suchst, schaue Dir mal die "Codeblocks Arduino Edition" an:
http://arduinodev.com/codeblocks/

Das ist eine "alternative IDE" mit mehr Möglichkeiten - auch beim Editor. Selbst ein Hex-Editor gehört mit dazu, so dass Du nicht nur CPP und H Datein öffnen und editieren kannst, sondern über die Funktion "Open with Hex Editor" kannst Du meinetwegen auch Binärdateien öffnen und direkt editieren. Denn richtige Programmierer wie Du brauchen wahrscheinlich gar keinen Compiler, die editieren sich eine HEX-Datei direkt selbst.
 smiley-wink


23  International / Deutsch / Re: Editieren / anschauen von .h und .c dateien in der library on: April 14, 2014, 06:54:07 am
Irgend eine Idee wie ich (ohne externen Editor) das bewerkstelligen kann?

Jedes Betriebssystem kommt bereits in der Standardinstallation mit mindestens einem, meistens sogar mehreren Editoren.

Unter Windows stets geeignete Editoren sind Write/Wordpad.
Wenn es sich um unter Windows erstellte Dateien handelt, geht auch  Notepad.

Bei anderen Betriebssystemen mögen Editoren andere Namen haben, aber irgendein Editor ist immer vorhanden.
24  International / Deutsch / Re: Der HMC5883L- was treibt er? on: April 13, 2014, 02:23:21 pm
Nachdem der Beitrag schon älter ist und zwar über 100 mal gelesen, aber nie beantwortet wurde, poste ich einfach mal einen einfachen "Kompass-Code" für diesen Sensor.

Wie bei einem Magnetkompass gilt: Den Sensor absolut waagerecht ausrichten und keine eisenhaltigen Metallteile oder starke Magnetfelder in der Nähe!

Dann ergibt sich die Kompassrichtung alleine aus den x- und y- Anteilen des Erdmagnetfelds.

Code:
#include <Wire.h>

#define Addr 0x1E               // 7-bit address of HMC5883 compass

void setup() {
  Serial.begin(9600);
  Serial.println();
  Wire.begin();
 
  // Set operating mode to continuous
  Wire.beginTransmission(Addr);
  Wire.write(byte(0x02));
  Wire.write(byte(0x00));
  Wire.endTransmission();
}

void loop() {
  int x, y, z;

  // Initiate communications with compass
  Wire.beginTransmission(Addr);
  Wire.write(byte(0x03));       // Send request to X MSB register
  Wire.endTransmission();

  Wire.requestFrom(Addr, 6);    // Request 6 bytes; 2 bytes per axis
  if(Wire.available() <=6) {    // If 6 bytes available
    x = Wire.read() << 8 | Wire.read();
    z = Wire.read() << 8 | Wire.read();
    y = Wire.read() << 8 | Wire.read();
  }
  // If compass module lies flat on the ground with no tilt,
  // just x and y are needed for calculation
  float heading=atan2(-x, y)/0.0174532925;
  if(heading < 0) heading+=360; // N=0/360, E=90, S=180, W=270
  Serial.println(heading); 
  delay(500);
}
25  Using Arduino / Programming Questions / Re: Finding degrees using a HMC5883L Compass on: April 13, 2014, 12:35:12 pm
I was wondering how to convert the raw values of the x, y , z to get degrees like a regular compass. Do I need to use the y and z values to do this?

If the compass module lies flat on the ground with no tilt, you just need x and y for some easy calculations:
Code:
#include <Wire.h>

#define Addr 0x1E               // 7-bit address of HMC5883 compass

void setup() {
  Serial.begin(9600);
  Serial.println();
  Wire.begin();
 
  // Set operating mode to continuous
  Wire.beginTransmission(Addr);
  Wire.write(byte(0x02));
  Wire.write(byte(0x00));
  Wire.endTransmission();
}

void loop() {
  int x, y, z;

  // Initiate communications with compass
  Wire.beginTransmission(Addr);
  Wire.write(byte(0x03));       // Send request to X MSB register
  Wire.endTransmission();

  Wire.requestFrom(Addr, 6);    // Request 6 bytes; 2 bytes per axis
  if(Wire.available() <=6) {    // If 6 bytes available
    x = Wire.read() << 8 | Wire.read();
    z = Wire.read() << 8 | Wire.read();
    y = Wire.read() << 8 | Wire.read();
  }
  // If compass module lies flat on the ground with no tilt,
  // just x and y are needed for calculation
  float heading=atan2(x, y)/0.0174532925;
  if(heading < 0) heading+=360;
  heading=360-heading; // N=0/360, E=90, S=180, W=270
  Serial.println(heading); 
  delay(500);
}
26  International / Deutsch / Re: BMP085 - Pin Belegung? | Verzweiflung on: April 13, 2014, 08:54:11 am
Es ist vollkommen egal welchen Sketch von den vielen vorgegebenen verwende, es wird mir nie ein Ergebniss presentiert.
Dies ist dadurch begründet, dass ich nicht verstehe, wo ich jetzt die Pinbelegung vollziehen kann.

Die Pinbelegung vollziehst Du über die Einstellung "Tools-Board" und im Sketch mit der Zeile:
Code:
#include "Wire.h"
Die Library weiß über das in der Arduino-Software eingestellte Board, welches die I2C-Pins des Controllers sind, der sich auf dem Board befindet.

Jetzt mußt Du nur noch selber wissen, welches die I2C-Pins auf Deinem Board sind und den Sensor dort auch anschließen.

Auf "MEGA" und manchen anderen Boards sind die Pins SDA und SCL im Klartext beschriftet.
Auf einem UNO ist A4=SDA und A5=SCL.

Der BMP085 ist ein 3.3V Sensor.
Die PullUp-Widerstände in Deiner Schaltung mußt Du also an 3.3V betreiben.
Auf fertigen "Breakout-Boards mit BMP085" sind die PullUp-Widerstände üblicherweise bereits enthalten, so dass Du in dem Fall keine zusätzlichen benötigst, im Zweifelsfall das Schaltbild des Breakout-Boards beachten!

Ich arbeite mit einem Sensorboard, wo die jeweiligen Sensoren raufgelötet werden. Die Sketche aus dem Netz sind alle so
angepasst, dass mal Analog4 und Analog5 nimmt. Dies geht bei mir allerdings nicht, da diese an meinem Board nicht
neben einander liegen...

Diese Aussage klingt für mich völlig sinnlos.
Einen I2C-Sensor kannst Du am hardwaremäßig vorhandenen I2C-Bus des Boards verwenden.
Oder Du kannst es mit I2C-Sensoren bleiben lassen.

An "anderen Pins" als dem Hardware-I2C Anschluß eines Boards kannst Du zwar auch mit einigem softwaretechnischen Zusatzaufwand I2C-Sensoren betreiben, allerdings müßtest Du dann mit Software-I2C erstmal eine Hardware-I2C Schnittstelle emulieren. Für so einen umständlichen Quatsch gibt es meines Erachtens nach keine Arduino-Beispielsketche für den BMP085. Die Beispiel-Sketche für BMP085 sind immer für die Verwendung von Hardware-I2C, beim UNO also an A4 und A5.

Es gibt allerdings wohl auch eine Software-I2C Library für Arduino, falls Du es unbedingt und unnötigerweise verkomplizieren möchtest mit dem Auslesen des Sensors... wie gesagt, auf einem Controller-Board mit Hardware I2C schließt man I2C-Sensoren auch genau an die Pins der Hardware-I2C Schnittstelle an, alles andere ist relativ sinnfrei.
27  International / Deutsch / Re: Was mache ich fasch?? on: April 13, 2014, 06:57:51 am
uje-uje... Arduino ist jetzt in meinem ansehen schwer gesunken!

Werd mal mit den macros arbeiten bzw. gleich ne eigene library schreiben um diese immer wieder zu erweitern.
Tja dann könnt ich allerdings gleich beim AVR Studio bleiben hmmm schade.

Wenn Du Deine Pins schneller setzen möchtest und die Pins sind im Programm Konstanten, dann kannst Du Dir auch irgendwo im Internet Makros für digitalReadFast und digitalWriteFast raussuchen und verwenden.

Die Arduino-Funktionen sind schon so das schnellstmögliche, und zwar für Pins, die erst zur Laufzeit des Programms feststehen. Also wenn der Pin beispielsweise eine Variable ist, die zur Laufzeit ausgerechnet wird und danach soll der Pin gesetzt werden. Das ist in vielen Programmen zwar gar nicht notwendig, aber aus Gründen der Einfachheit gibt es in der Arduino-Software nur diese eine langsame Funktion, die an einer variablen Pin-Nummer funktioniert.

Ich glaube, von "digitalReadFast" und "digitalWriteFast" gibt es sogar Versionen, bei denen das Makro prüft, ob die übergebene Pin-Nummer eine Konstante oder eine Variable ist: Ist es eine Konstante, wird der Pin viel schneller gesetzt, und ist es eine Variable, dann wird das langsame digitalRead/digitalWrite aufgerufen.

Im übrigen ist es Dir unbenommen, auch in der Arduino-Software die Ports direkt über die Register des Atmega zu setzen.
28  International / Deutsch / Re: 3v Motor und Arduino Nano/Mini mit einer Stromquelle betreiben on: April 13, 2014, 06:30:48 am
Mein Problem ist jetzt das ich das ganze gerne nur über eine Stromquelle betreiben würde. Im Moment fällt mir nur ein das ganze mit zwei getrennten Stromkreisen zu betreiben. Einmal 9v oder 4 AA für den Arduino und 2 AA für den Motor, was aber sehr lästig wäre.

Ich würde die Stromversorgung mit 3*AA (Mignon) oder 3*AAA (Micro) machen.

Drei Batterien oder Akkus decken je nach Entladezustand mit Alkaline oder NiMH Zellen einen Spannungsbereich von ca. 4.5V (Alkaline frisch, unbelastet) bis runter zu 3.0V (Entnahme-/Entladeschlussspannung von drei Alkaline oder NiMH Zellen) ab.

Den Motor betreibst Du direkt am Batteriepack.
Den Arduino hängst Du über einen zwischengeschalteten Step-Up-Converter, der für gleichmäßige 5V am Controller-Board sorgt, sowas wie eBay Nr. 360831186525 oder vergleichbares.

29  International / Deutsch / Re: Temperatursteuerung bremst Arduino uno aus - Warum? on: April 12, 2014, 09:33:43 am
@jurs: Ich habs ausprobiert und die DHT Library scheint das Problem zu sein. Ich habe die Library von:

Guckst Du Quellcode, weißt Du Bescheid:
Code:
boolean DHT::read(void) {
...
  // pull the pin high and wait 250 milliseconds
  digitalWrite(_pin, HIGH);
  delay(250);

Das ist Code, den Du für nicht-interaktive Programme gebrauchen kannst. Sagen wir mal ein batteriebetriebener Temperatursensor ohne jegliche Bedienelemente hängt im Garten und funkt alle drei Minuten seine Temperatur an eine Wetter-Basisstation im Haus. Dem Sensor im Garten ist es völlig egal, ob Du in den drei Minuten zwischen zwei Messungen das Programm für eine Viertelsekunde blockierst oder nicht. Da ist so etwas brauchbar.

Bei interaktiven Programmen, die blitzschnell auf Benutzereingaben reagieren sollen, ist das Programm mit einem "delay(250)" von einer Viertelsekunde in jeder loop schon total verkackt.

Solche digitalen Temperatursensoren benötigen alle eine bestimmte Auslesezeit zwischen "Anforderung einer Messung" und "Auslesen der Daten".  Und im Endeffekt muß die Library genau das auch widerspiegeln, d.h. es muss eine Funktion zum Anfordern einer Messung geben und eine andere Funktion zum Abholen der Messdaten, die man dann erst nach einer bestimmten Zeit aufruft. Und zwischendrin kann das Programm eine Viertelsekunde lang beliebige andere Dinge tun, z.B. auf Tastendrücke reagieren.

Deine Library ist wegen der Verwendung von "delay(250)" für interaktive Programme unbrauchbar.

Du kannst bei einem interaktiven Programm allenfalls die negativen Auswirkungen verringern, wenn Du die Temperatur seltener ausliest. Mal angenommen,, Du liest die Temperatur statt "ständig in der loop" nur noch "einmal pro Minute" aus, dann würde auch nur einmal pro Minute das delay auftreten und damit das Programm viel seltener für Eingaben blockiert sein.

Aber im Endeffekt wäre das nur ein Herumstümpern an Symptomen. Für ein interaktives Programm muss viel eher das Auslesen des Sensors optimiert werden.
30  International / Deutsch / Re: Sd auslesen, letzte xx Zeilen (Datenlogger) on: April 11, 2014, 03:06:27 pm
Jetzt würde ich die Daten gerne Zeilenweise wieder auslesen, aber immer nur die aktuellsten (letzten) 10 Stück.  Vorwärts oder rückwärts ist egal.
Ist das machbar?

Warum sollte das nicht machbar sein?

Am einfachsten wäre es machbar, wenn alle Zeilen der LOG-Datei immer gleich lang wären.
Also z.B. jede Log-Zeile immer 78 Zeichen + CR + LF als Zeilenendezeichen, macht 80 Zeichen pro Zeile.

Dann würdest Du die Dateigröße auslesen, mit http://arduino.cc/de/Reference/FileSeek auf Dateigröße minus 800 positionieren und anfangen zu lesen.
Code:
file.seek(file.size()-800); // oder so ähnlich

Wenn alle Zeilen in der Logdatei unterschiedlich lang sind, wird das komplizierter. Dann würdest Du einen Zeilenpuffer benötigen, der größer ist als die längste Logzeile und könntest dann nach dieser Logik vorgehen:
Code:
file.seek(file.size()-sizeof(linebuf));
dann den Puffer einlesen und durchzählen, wieviele Zeilenende-Zeichen enthalten sind.
Falls weniger als 10:
Code:
file.seek(file.size()-2*sizeof(linebuf));
dann den Puffer einlesen und weiter durchzählen, wieviele Zeilenende-Zeichen enthalten sind.
etc. bis mindestens 10 Zeilenendezeichen am Dateiende erkannt wurden.
Falls mehr als 10 gelesen wurden, nun im Puffer so weit vorgehen, bis exakt das 10. Zeilenende Zeichen erreicht ist. Ab dem nächsten Zeichen beginnt dann die zehntletzte Zeile.

Andere Programmlogik, die aber meistens viel länger dauern dürfte:
- Datei öffnen, alle Zeilen durchzählen, Datei schließen
- Datei öffnen und bis Anzahl Zeilen minus 10 durchlesen
- auch dann ist man bei der zehntletzten Zeile

Viele Wege führen nach Rom.
Pages: 1 [2] 3 4 ... 164