Arrays mit ++ erhöhen

  • C++

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von BiedermannS.

    Arrays mit ++ erhöhen

    Guten Morgen,

    ich hab gestern mein Teensy Developmentboard bekommen und natürlich auch gleich mit der Programmierung begonnen, dabei ist mir folgender Code (aus einem Beispiel) aufgefallen:

    C-Quellcode

    1. int8_t circle[];
    2. int main(void)
    3. {
    4. p = circle;
    5. for (i=0; i<36; i++) {
    6. //Hier wird mit p++ das nächste Element aus dem Array abgerufen
    7. x = pgm_read_byte(p++);
    8. y = pgm_read_byte(p++);
    9. }
    10. }


    Nun zu meiner Frage, ist das etwas AVR-spezifisches oder ist es generell in c++ möglich, mit ++ das nächste Element eines Arrays bzw deren Adresse abzurufen?

    Wenn ja wie? (Bei mir funktionierts nämlich nicht ^^)

    Hier noch der Gesamte Code:
    Spoiler anzeigen

    C-Quellcode

    1. #include <avr/io.h>
    2. #include <avr/pgmspace.h>
    3. #include <util/delay.h>
    4. #include "usb_mouse.h"
    5. #define LED_CONFIG (DDRD |= (1<<6))
    6. #define LED_ON (PORTD &= ~(1<<6))
    7. #define LED_OFF (PORTD |= (1<<6))
    8. #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
    9. int8_t circle[];
    10. int main(void)
    11. {
    12. int8_t x, y, *p;
    13. uint8_t i;
    14. // set for 16 MHz clock
    15. CPU_PRESCALE(0);
    16. LED_CONFIG;
    17. LED_OFF;
    18. // Initialize the USB, and then wait for the host to set configuration.
    19. // If the Teensy is powered without a PC connected to the USB port,
    20. // this will wait forever.
    21. usb_init();
    22. while (!usb_configured()) /* wait */ ;
    23. // Wait an extra second for the PC's operating system to load drivers
    24. // and do whatever it does to actually be ready for input
    25. _delay_ms(1000);
    26. while (1) {
    27. _delay_ms(1000);
    28. LED_ON; // turn the LED on while moving the mouse
    29. p = circle;
    30. for (i=0; i<36; i++) {
    31. x = pgm_read_byte(p++);
    32. y = pgm_read_byte(p++);
    33. usb_mouse_move(x, y, 0);
    34. _delay_ms(20);
    35. }
    36. LED_OFF;
    37. _delay_ms(9000);
    38. // This sequence creates a right click
    39. //usb_mouse_buttons(0, 0, 1);
    40. //_delay_ms(10);
    41. //usb_mouse_buttons(0, 0, 0);
    42. }
    43. }
    44. int8_t PROGMEM circle[] = {
    45. 16, -1,
    46. 15, -4,
    47. 14, -7,
    48. 13, -9,
    49. 11, -11,
    50. 9, -13,
    51. 7, -14,
    52. 4, -15,
    53. 1, -16,
    54. -1, -16,
    55. -4, -15,
    56. -7, -14,
    57. -9, -13,
    58. -11, -11,
    59. -13, -9,
    60. -14, -7,
    61. -15, -4,
    62. -16, -1,
    63. -16, 1,
    64. -15, 4,
    65. -14, 7,
    66. -13, 9,
    67. -11, 11,
    68. -9, 13,
    69. -7, 14,
    70. -4, 15,
    71. -1, 16,
    72. 1, 16,
    73. 4, 15,
    74. 7, 14,
    75. 9, 13,
    76. 11, 11,
    77. 13, 9,
    78. 14, 7,
    79. 15, 4,
    80. 16, 1
    81. };
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    C-Quellcode

    1. x = pgm_read_byte(++p);
    2. y = pgm_read_byte(++p);


    Schau dir mal mehr zu Pre/Post Increment an.

    C-Quellcode

    1. pgm_read_byte(p++)

    Der Wert von p wird übergeben und danach wird p um eins erhöht.

    C-Quellcode

    1. pgm_read_byte(++p)

    Der Wert von p wird um eins erhöht und danach wird der Wert von p übergeben.

    C-Quellcode

    1. void main()
    2. {
    3. int i = 0;
    4. printf("i = %d\n", i++);
    5. printf("i = %d\n\n", i);
    6. printf("i = %d\n", ++i);
    7. printf("i = %d\n", i);
    8. }

    Ausgabe =>

    Quellcode

    1. i = 0
    2. i = 1
    3. i = 2
    4. i = 2
    Das ist ein etwas komplexes Thema, aber grundsätzlich viel von C.

    Zunächst: ein AVR ist recht unterschiedlich mit einem normalen Computer!
    der Programmspeicher (Flash) und der Arbeitsspeicher (RAM) sind bei der Havard (AVR) Architektur getrennt.
    Bei PCs (von-Neumann) liegt beides im gleichen Speicher.

    pgm_read_byte() Erlaubt dir ein Byte aus dem Flash zu lesen, an der angegebenen Adresse.

    C kennt als Variablen erstmal keine Arrays.
    Was du dort hast ist eine Zahl, kein Array.
    Diese Zahl ist ein Pointer auf die Adresse, ander das Array im Speicher liegt.

    Ein CharArray enthält Zeichen, zeichen sind meist einzelne Bytes. Dadurch springst du mit p++; zum nächsten Zeichen im Array, weil du halt die Adresse zum auslesen erhöhst...

    Hoffe, das war verständlich..
    Gruß,
    Manawyrm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manawyrm“ ()

    Das mit dem inkrementieren ist mir bewusst.

    @Manawyrm:
    Danke, jetzt versteh ich es. Ist ja eigentlich logisch. nur aus vb.net sicht, wenn man das ganze als typ array sieht, macht es keinen sinn. denn ein array um eins erhöhen, geht ja nicht.

    Alles klar :D
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D