Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 4
1

Преобразование типов указателей

22.01.2012, 12:34. Показов 3984. Ответов 4
Метки нет (Все метки)

Помогите найти ошибку в коде лабораторной работы по Си.

Дано задание:
Разработать две функции, одна из которых вводит с клавиатуры набор данных в произвольной последовательности и размещает в памяти в переменном формате. Другая функция читает эти данные и выводит на экран. Программа запрашивает и размещает в памяти несколько наборов данных при помощи первой функции, а затем читает их и выводит на экран при помощи второй. Размещение данных производить в статическом массиве байтов фиксированной размерности с контролем его переполнения.

Упакованная строка, содержащая символьное представление целых чисел. Все символы строки, кроме цифр, помещаются в последовательность в исходном виде. Последовательность цифр преобразуется в целую переменную, которая записывается в упакованную строку, предваренная символом \0. Конец строки - два подряд идущих символа \0. Пример:
-исходная строка: "aa2456bbbb6665"
-упакованная строка: 'a' 'a' '\0' 2456 'b' 'b' 'b' 'b' '\0' 6665 '\0' '\0'

Программа выполняет указанные операции, но в момент смены типа указателя я чтото делаю неверно, в результате число в упакованной строке записывается или извлекается неверно.

Вот код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <stdio.h>
#include <conio.h>
 
char  packstr[100];           // строка, в которую будем упаковывать
char* ptr;                          // указатель, который ходит по строке
int* tmp;
 
 
void getStr(char*);
void strPack(char*);
void Print(char*);
 
 
void main()
{
    char string[100];
    clrscr();
 
    getStr(string);
    strPack(string);
    Print(packstr);
    printf("\n\n\n\nKontrol': %s", packstr);
 
    getch();
}
 
 
void getStr(char * str)
{
    printf("Vvedite stroku:\n");
    gets(str);
}
 
void strPack(char * str)
{
    int i;
    int    num = 0;
    ptr=&packstr[0];
 
 
    for(i=0; i<100; i++)
   {
     packstr[i]=49;
   }
 
    while(*ptr!=0&&*str!=0)
    {
    if(*str<58&&*str>47)
    {
        while(*str<58&&*str>47)
        {
        num *= 10;
        num += *str - '0';
        str++;
 
        }
        printf("Rezultat preobrazovaniya:   %d\n",num);
        *ptr='\\0';
        ptr++;              //указатель делает шаг вправо по упакованной строке
        tmp=(int*)ptr;             //преобразовываем тип указателя
        *tmp=num;          //помещаем в упакованную строку интовое значение
        ptr=(char*)tmp;
        ptr++;              //указатель делает шаг вправо по упакованной строке
 
    }
    else
    {
        num = 0;
        *ptr=*str;
         ptr++;              //указатель делает шаг вправо по упакованной строке
         str++;              //указатель делает шаг вправо по исходной строке
    }
    }
 
    if(*str++==0)
    {
       *ptr++='\\0';
       *ptr++='\\0';
 
 
    }
}
 
void Print(char* str)
{
    int i;
    printf("Upakovannaya stroka:  ");
    for(i=0;i<100;i++)
  {
    if(*str=='\\0')
       {
    printf("%c",*str);
    str++;
    if(*str=='\\0')  {return;}
    else
      {
        tmp=(int*)str;             //преобразовываем тип указателя
        printf("%d",*tmp);          //печатаем на экран
        str++;              //указатель делает шаг вправо по упакованной строке
      }
       }
      else
      {
        printf("%c",*str);          //печатаем на экран
        str++;
      }
   }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2012, 12:34
Ответы с готовыми решениями:

Массив указателей на структуры разных типов
Здравствуйте! Подскажите, делаю следующее void **dev = NULL; ... int main (int argc, char...

преобразование типов
помогите решить проблему, например v = 11.11, почему когда я передаю значение в с, то оно...

Указатели, преобразование их типов
Приветствую всех, прошу помочь разобраться. Факи, статьи, книги копал- ответа на свой вопрос не...

Преобразование типов с переводом в 10 СС
Всем привет. Есть переменная типа char в которой хранится примерно следующее: 1A17, что в 10...

4
0 / 0 / 0
Регистрация: 03.03.2015
Сообщений: 2
30.06.2015, 22:57 2
C
1
2
3
4
5
void strPack(char * str)
{
    int i;
    int    num = 0;
    ptr=&packstr[0];
Надо инициализировать(обьявить) как указатель на указатель char**ptr; а после уже ptr=&packstr[0];
0
Диссидент
Эксперт C
26350 / 16356 / 3558
Регистрация: 24.12.2010
Сообщений: 36,219
01.07.2015, 08:01 3
mustang170291, Не вводите ТС в заблуждение. У него объявлено char packstr[100]; char *ptr; (как глобальные, но это - моветон, а не ошибка), и "ptr = &pakstr[0];" конструкция совершенно законная (хотя я бы написал "ptr = packstr; ")

Добавлено через 7 минут
Wik, Подробно в вашем коде не разбирался, но есть подозрение, что в строке 63 надо ptr += 2;
Число ведь занимает 2 байта!
А еще лучше ptr += sizeof(int);

Добавлено через 16 минут
Я бы этот кусок (58-63)
C
1
2
3
4
5
6
       *ptr='\\0';
        ptr++;              //указатель делает шаг вправо по упакованной строке
        tmp=(int*)ptr;             //преобразовываем тип указателя
        *tmp=num;          //помещаем в упакованную строку интовое значение
        ptr=(char*)tmp;
        ptr++;
переписал так
C
1
2
3
        *ptr='\\0';
        memcpy(ptr+1, &num, sizeof(int));
        ptr+=sizeof(int)+1;
0
0 / 0 / 0
Регистрация: 03.03.2015
Сообщений: 2
01.07.2015, 19:34 4
суть сообщения не завести в заблуждение ,я прекрасно видет что глобально обьявленный указатель char* ptr;а суть сообщения была донести что там нужен указатель на указатель тоесть char**ptr;
0
Диссидент
Эксперт C
26350 / 16356 / 3558
Регистрация: 24.12.2010
Сообщений: 36,219
01.07.2015, 23:26 5
mustang170291, вы ошибаетесь. Это так, к слову. Потому что дальше полемизировать на эту тему не входит в мои планы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2015, 23:26

Преобразование типов вручную
Необходимо написать функцию преобразования строки цифр в число. Читал на сайтах, вычитал способ:...

Корректно ли приведенное преобразование типов
Здравствуйте! int p; float d = 2.54f; float rezult; rezult = p * d; Подскажите...

Нестандартное преобразование типов данных
Помогите пожалуйста Tесть код int a; int b double c; Как сделать

Преобразование типов, long и unsigned
1.Если какой-либо операнд имеет тип long, то другой операнд преобразуется к типу long, и это и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru