Массив указателей на массивы. Печать строк в PIC18 MPLAB IDE - PullRequest
2 голосов
/ 02 ноября 2011

Я пишу C-код для использования в микроконтроллере PIC 18 с использованием MPLAB IDE.У меня есть 5 строк, и я хочу иметь возможность использовать указатели.Идея состоит в том, чтобы иметь массив, содержащий указатели на строковые массивы.и пусть они печатают на консоли.Приведенный ниже код компилируется без ошибок или предупреждений, но все, что я получаю на консоли, - это мусор.

Может кто-нибудь указать мне правильное направление.большое спасибо.извините, если мое форматирование кода неверно.

#include <stdio.h>
#include <p18f4520.h>
#include <stdlib.h> 
#pragma config WDT = OFF

#define size 64

#pragma romdata s1=0x300                        //specific ROM addresses for the data
  rom char *s1[] = "Hello";
#pragma romdata s2 = 0x307
  rom char *s2 = "Welcome to C programming";

#pragma romdata s3=0x31A
  rom char *s3= "My name is ";  

#pragma romdata s4=0x32C
  rom char *s4 = "Pic18 program";

#pragma romdata s5=0x33A
  rom char *s5 ="Goodbye, I hope this works!";


void printString(const char*);

void main (void) 
{   
    int i=0;

    char stringArray [] = {*s1, *s2, *s3, *s4, *s5};
    char *ptr=stringArray;


       while(i<5)
        {
             printString(&ptr[i]);
             i++;
          }
}

void printString( const char *strPtr)
{
   while(*strPtr !='\0')
     {
       printf("%c", strPtr);
       strPtr++;

      } 
}

`

Ответы [ 4 ]

1 голос
/ 06 апреля 2012

Ну, это ответ.

#include <stdio.h>
#include <p18f4520.h>
#include <stdlib.h> 
#include <string.h>
#pragma config WDT = OFF

#pragma romdata s1=0x300                      //specific ROM addresses for the data
 rom char s1[] = "Hello";
#pragma romdata s2 =0x307
   rom char s2[] = "Welcome to C programming";
#pragma romdata s3=0x41A
   rom char s3[] = "My name is";
#pragma romdata s4=0x32C
  rom char s4[] = "Pic18 program";
#pragma romdata s5=0x33A
   rom char s5[] ="Goodbye, I hope this works!";

void printAndCount(rom char *strPtr);
int j=0; int i=0;
void main (void)
{
    rom char* stringArray [] = {s1, s2, s3, s4, s5};
                    while(i<5 )
                {
                    printAndCount(stringArray[i]);  
                            i++;
                }
}
void printAndCount(rom char *strPtr)
    {   
    while (*strPtr != '\0' )
        {   printf("%c", *strPtr);
            strPtr++;
            ++j;    
                }
            printf("     %d\n",j);
            j=0;
}
0 голосов
/ 02 ноября 2011

Проблема в том, что в вашем коде stringArray обозначает блок памяти, в котором хранится первый символ каждой строки, а не их адрес, попробуйте следующее:

void main (void) 
{   
    int i=0;

    char * stringArray [] = {s1, s2, s3, s4, s5};
    char **ptr=stringArray;


       while(i<5)
        {
             printString(*ptr[i]);
             i++;
          }
}
0 голосов
/ 02 ноября 2011

В этом коде есть несколько фундаментальных ошибок.Используйте это вместо этого.

#include <stdio.h>
#include <p18f4520.h>
#include <stdlib.h> 
#pragma config WDT = OFF

#define size 64

// store ARRAYS here not pointers!
// Im not sure what non-standard "rom" means more exactly, 
// but these should be const in the C language
#pragma romdata s1=0x300                        //specific ROM addresses for the data
  rom const char s1[] = "Hello";                      
#pragma romdata s2 = 0x307
  rom const char s2[] = "Welcome to C programming";   

#pragma romdata s3=0x31A
  rom const char s3[] = "My name is ";                

#pragma romdata s4=0x32C
  rom const char s4[] = "Pic18 program";

#pragma romdata s5=0x33A
  rom const char s5[] ="Goodbye, I hope this works!";


void printString (const char* strPtr);

void main (void) 
{   
    int i=0;

    // this, however, must be an array of pointers (that point to the strings)
    // since the strings are const, the pointers must be declared pointer-to-const:
    const char* stringArray [] = {s1, s2, s3, s4, s5};

    while(i<5)
    {
         printString(stringArray[i]);  // now this syntax suddenly turned sane
         i++;
    }
}

void printString (const char *strPtr)
{
   while(*strPtr !='\0')
     {
       printf("%c", *strPtr);
       strPtr++;
      } 
}
0 голосов
/ 02 ноября 2011

Попробуйте вместо этого:

#include <stdio.h>
#include <p18f4520.h>
#include <stdlib.h> 
#pragma config WDT = OFF

#pragma romdata s1=0x300                        //specific ROM addresses for the data
  rom char s1[] = "Hello";
#pragma romdata s2 = 0x307
  rom char s2[] = "Welcome to C programming";
#pragma romdata s3=0x31A
  rom char s3[] = "My name is ";  
#pragma romdata s4=0x32C
  rom char s4[] = "Pic18 program";
#pragma romdata s5=0x33A
  rom char s5[] ="Goodbye, I hope this works!";


void main (void) 
{   
    int i;
    char *stringArray [] = {s1, s2, s3, s4, s5};

    for (i = 0;  i < 5;  ++i)
    {
        printf("%s", stringArray[i]);
    }
}

Это упрощает и делает несколько исправлений, наиболее существенным для решения проблемы было устранение * перед каждым именем строки в stringArray. Другие изменения вносятся в обычное кодирование C.

...