Forum: PC-Programmierung C++ Array Problem


von Casio (Gast)


Lesenswert?

Hi,
ich habe ein Problem bei einer eigendlich recht simpeln Aufgabe...

Ich möchte in einem Array einzelne Bits vertauschen und soweit ich weiß 
müsste das doch so funktionieren wie es in meinem Code steht??

Also aus:     10100101 sollte im Bsp. unten :   00100101 werden ... das 
passiert aber nicht ...

Jemand eine Idee woran das liegen könnte?





1
#include <iostream>
2
#include <stdlib.h>
3
using namespace std;
4
5
int main() {
6
7
int i[10];
8
int y;
9
int x;
10
11
cin >> i[10];
12
13
14
i[0]=i[1];
15
16
17
cout << i[10] << endl;
18
19
20
system ("PAUSE");
21
return 0;
22
23
24
}

von Floh (Gast)


Lesenswert?

1.
i sind 10 INT, nicht Bit.
2.
> i[0]=i[1];
Damit wird nur das Element 1 auf 0 kopiert, nicht aber getauscht.
Für tauschen wäre eher sowas gut: (mit Zwischenspeicher)
1
int temp;
2
temp = i[1];
3
i[1] = i[0];
4
i[0] = temp;

von Franks (Gast)


Lesenswert?

achtung

cout << i[10] << endl;

damit schreibst du über das Array hinaus

von Karlheinz D. (kdruschel)


Lesenswert?

Also für mein Verständnis ist das nur Müll.
Du schreibst: int i[10];
Somit kannst Du 10 Elemente adressieren, aber die zählen von i[0]..i[9].
i[10] steht irgendwo hintendran im speicher, parktisch gibts das gar 
nicht.
dann liest Du in diesen nicht reservierten speicher i[10] was ein.
Die Anweisung i[0]=i[1] überschreibt den Wert im Index 0 mit dem Wert 
aus dem Index1.
Aber ausgeben tust Du wieder den Wert aus dem nicht reservierten 
Speicher, also genau das was du eingegeben hast.

von Linker (Gast)


Lesenswert?

1
struct bits {
2
  char bit0 : 1;
3
  char bit1 : 1;
4
   ...
5
  char bit7 : 1;
6
} foobits;
7
8
foobits.bit0 = 1;
9
foobits.bit7 = ~foobits.bit0;
10
  ...

von Casio (Gast)


Lesenswert?

Floh schrieb:
> 1.
> i sind 10 INT, nicht Bit.
> 2.
>> i[0]=i[1];
> Damit wird nur das Element 1 auf 0 kopiert, nicht aber getauscht.
> Für tauschen wäre eher sowas gut: (mit Zwischenspeicher)int temp;
> temp = i[1];
> i[1] = i[0];
> i[0] = temp;

Hab das mal ausprobiert, aber dadurch ändert sich leider an der Ausgabe 
nichts...

von guest (Gast)


Lesenswert?

Casio schrieb:
> dadurch ändert sich leider an der Ausgabe
> nichts...

warum auch? es wird aufs 10te element eingelesen, nichts damit getan und 
wieder ausgegeben. verändere mal i[10] und schon siehst du was. was hast 
du überhaupt vor? erzähl mal was dazu.

von Karlheinz D. (kdruschel)


Lesenswert?

kann ja auch nicht, warum soll sich da was ändern ?
wobei ich natürlich Linker Recht geben muss mit BIT und Int

von Casio (Gast)


Lesenswert?

Der Code sieht jetzt so aus und die Ausgabe bleibt unverändert

1
#include <iostream>
2
#include <stdlib.h>
3
using namespace std;
4
5
int main() {
6
7
int i[10];
8
int x;
9
10
cin >> i[9];
11
12
x = i[1];
13
i[1]=i[0];
14
i[0] = x;
15
16
17
cout << i[10] << endl;
18
19
20
system ("PAUSE");
21
return 0;
22
}

von guest (Gast)


Lesenswert?

Casio schrieb:
> cin >> i[9];
>
>
> cout << i[10] << endl;

???
wie ist deine programmiererfahrung?

von Karl H. (kbuchegg)


Lesenswert?

Casio schrieb:
> Der Code sieht jetzt so aus und die Ausgabe bleibt unverändert

logisch.
Wenn du einen von 25 Fehlern korrigierst bleiben immer noch 24 andere.

Die Prominentesten davon

* int sind keine Bit
* ein Array kann man als ganzes in einem Rutsch weder eingeben
  noch ausgeben
* der höchste Index in einem Array der Länge n ist n-1.
  Bei der Definition gibt man die Anzahl der Elemente an (also die 
Länge).
  Ein Array
  int  a[5];
  hat also 5 Elemente.
  a[0], a[1], a[2], a[3], a[4]
  Zähl nach, sind genau 5 Stück. Trotzdem ist der höchste gültige
  Index 4.
* ...

von Casio (Gast)


Lesenswert?

guest schrieb:
> wie ist deine programmiererfahrung?

Wie du siehst sehr bescheiden :-)


Wenn beim cout  i[9] steht (wie beim cin) tut sich aber auch nichts ...

von guest (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die prominentesten davon

und cout << i[10] iss wie ein griff ins klo.

von Casio (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Karl Heinz Buchegge

Und wie kann ich dem Problem beigehen?

von Karl H. (kbuchegg)


Lesenswert?

Casio schrieb:
> guest schrieb:
>> wie ist deine programmiererfahrung?
>
> Wie du siehst sehr bescheiden :-)

Kauf dir ein Lehrbuch und arbeite es von vorne weg durch.
Die Fehler, die man in deinem Beispiel sieht, weisen darauf hin, dass
* du keine vernünftige Literatur hast
* dir einiges an Grundlagen fehlt. Und zwar massiv fehlt.

Vergiss Online-Tutorials. Das steht meistens dir Hälfte nicht drinnen. 
Kauf dir ein vernünftiges Buch. Die 30€ sind gut investiert.

von guest (Gast)


Lesenswert?

Casio schrieb:
> tut sich aber auch nichts ...

du änderst es auch nicht. schreib mal irgendwo zwischen zeieln cin ... 
cout die zeile i[9] =* 2;

von guest (Gast)


Lesenswert?

guest schrieb:
> zeile i[9] =* 2;

schitt i[9] *= 2;

von Casio (Gast)


Lesenswert?

Sorry ich kapier nicht was ihr meint ...

Was müsste ich denn genau ändern damit das Programm das tut was es tun 
soll?
1
#include <iostream>
2
#include <stdlib.h>
3
using namespace std;
4
5
int main() {
6
7
int i[9];
8
int x;
9
10
cin >> i[8];
11
12
x = i[1];
13
14
i[0] = x;
15
cout << i[8] << endl;
16
17
18
system ("PAUSE");
19
return 0;
20
}

von ... (Gast)


Lesenswert?

Was solls denn tun?
Sowas?
1
#include <iostream>
2
#include <stdlib.h>
3
using namespace std;
4
5
int main() {
6
  int i;
7
8
  cin >> i;
9
  cout << i*2 << endl;
10
  system ("PAUSE");
11
  return 0;
12
}

von guest (Gast)


Lesenswert?

1
#include <iostream>
2
#include <stdlib.h>
3
using namespace std;
4
5
int main() {
6
7
int i[9];
8
// int x;
9
10
cin >> i[8];
11
12
// x = i[1];
13
14
i[8] *= 2;
15
cout << i[8] << endl;
16
17
18
system ("PAUSE");
19
return 0;
20
}

und halt dich an den tipp von khb: basics!

von Karl H. (kbuchegg)


Lesenswert?

Casio schrieb:
> Sorry ich kapier nicht was ihr meint ...
>
> Was müsste ich denn genau ändern damit das Programm das tut was es tun
> soll?

Dazu musst du erst mal definieren was es tun soll.
Deine 'Beschreibung' im Eröffnungsposting ist so nämlich erst mal 
Unsinn. Die kleinste Einheit, mit denen du erst mal arbeiten kannst, ist 
ein Byte. Aber keine Bit. Klar gehen auch Bits. Aber sicher nicht als 
Array.
Deine ganze Vorstellung davon was das Programm machen soll, ist schon 
verquert.

> [c]
> #include <iostream>
> #include <stdlib.h>
> using namespace std;
>
> int main() {
>
> int i[9];
> int x;
>
> cin >> i[8];

Das liest EINE Zahl ein und speichert sie in i[8].
EINE Zahl. Aber auf keinen Fall das ganze Array.

von Casio (Gast)


Lesenswert?

... schrieb:
> Sowas?

Nein,

es soll ein einzelner Wert überschrieben werden (siehe erster Post)

von ... (Gast)


Lesenswert?

Hehe, sind ja schon mal 2 Programme die das Gleiche tun :)

von Karl H. (kbuchegg)


Lesenswert?

Und wenn du wirklich BIts manipulieren musst, dann brauchst du kein 
Array sondern Grundlagen in binären Zahlen.

von ... (Gast)


Lesenswert?

Casio schrieb:
> ... schrieb:
>> Sowas?
>
> Nein,
>
> es soll ein einzelner Wert überschrieben werden (siehe erster Post)

Einzelner Wert? Welcher denn? Wie überschrieben? Was steht denn vorher 
drin? Wo denn im ersten Post? Wozu brauchst Du 10 int's, wenn Du eh nur 
einen einliest und wieder ausgibst?

von Casio (Gast)


Lesenswert?

So das ist meine Angabe für diese Aufgabe :


/* Schreiben Sie unten eine oder mehrere Anweisungen, die die
Bits in der Variable i so veraendern, dass zuletzt gilt:
In i haben die Bits an den Positionen 2 und 3 den Wert 0,
alle anderen Bits sind unverändert.
Anweisung(en): */


Ob ich jetzt 2 und 3 auf 0 setze oder 0 und 1 vertausche ist ja erstmal 
egal

von guest (Gast)


Lesenswert?

ahhhh, hausaufgaben! da hast du öfters geschwänzt, und jetzt ...

weiter ohen mich, guten8

von Karl H. (kbuchegg)


Lesenswert?

Casio schrieb:
> So das ist meine Angabe für diese Aufgabe :
>
>
> /* Schreiben Sie unten eine oder mehrere Anweisungen, die die
> Bits in der Variable i so veraendern, dass zuletzt gilt:
> In i haben die Bits an den Positionen 2 und 3 den Wert 0,
> alle anderen Bits sind unverändert.
> Anweisung(en): */

Und wo ist da jetzt von einem Array die Rede?

i einlesen
Bits vertauschen
i ausgeben

weit und breit kein Array

Bitmanipulation

von ... (Gast)


Lesenswert?

Du hast aber weder im ersten noch in irgend einem anderen Code 
irgendwelche Bits vertauscht. Das einzige, was hier je vertauscht wurde, 
waren zwei Ganzzahlwerte zufälligen Inhalts.

von ... (Gast)


Lesenswert?

Nochwas, wenn Du im von mir geposteten Program genau 2 
aufeinandefolgende Zeichen durch zwei andere ersetzt, macht es genau 
das, was Deine Aufgabe verlangt. Welche 2 Zeichen das sind darfst Du 
jetzt aber selber rausfinden.

von Casio (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> i einlesen
> Bits vertauschen
> i ausgeben

Die Frage is ja nur wie ich die Bits vertausche ...

von ... (Gast)


Lesenswert?

Ersten sollst Du keine Bits vertauschen sondern löschen. Und zweitens 
hat Karl Heinz nicht umsonst einen Link gepostet. Lesen mußt Du schon 
selber.

von Casio (Gast)


Lesenswert?

... schrieb:
> Lesen mußt Du schon
> selber.

Tja leider kapiert ich relativ wenig bis gar nichts bei dem Link

von ... (Gast)


Lesenswert?

Dann schau in Dein C-Lehrbuch und such nach dem & Operator.

von ... (Gast)


Lesenswert?

Falls Du des Englischen mächtig bist, kannst Du Dir hier mal den ersten 
Post durchlesen. Vielleicht ist es da für Dich etwas verständlicher.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=37871

von Klaus W. (mfgkw)


Lesenswert?

Die wievielte Aufgabe zum Bitfummeln ist das eigentlich in den letzten 
Tagen?
Da steht nicht zufällig gleich mit drunter, daß man sie bei 
mikrocontroller.net lösen lassen kann?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.