Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Где ошибка? 
:(
    Опции темы
olegarh
Дата 7.9.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет



Всем привет..

есть функция на вход которой подается дата (число месяц)
одна и та же дата может подаваться несколько раз например 03.05, след раз 03.05, а потом например 04.05.

нужно зафиксировать изменение даты и если она изменилась то выполнить некоторые действия

делаю так

Код

    static void OutXML (char* data)
    {

        static char* data1='\0';
        static bool fl=0;


                printf ("\nДата - %s",data);//когда дата меняется по идее data1 должна остаться старой, но получается что она равна data хотя никаких присваиваний я не делаю
        printf ("\nДата - %s",data1);
        printf ("\nфлаг - %d",fl);
    

        if ((data1!=data) && (fl==0))
        {
                        printf ("\nцикл1\n");//выполняем какие то действия
            data1=data;
            fl=1;
        }
        if ((data1==data) && (fl==0)){
            printf ("\nцикл2\n");//выполняем какие то действия
            
            fl=1;
        }
        if ((data1==data) && (fl==1))
        {
            printf ("\nцикл3\n");
            
        }
        if ((data1!=data) && (fl==1))
        {
            printf ("\nцикл4\n");
            data1=data;
            fl=0;
        }
    }


В итоге получается что программа один раз заходит в цикл1 потом крутиться в цикле3 даже если дата меняется. в чем дело не пойму.


Это сообщение отредактировал(а) olegarh - 7.9.2011, 13:00
PM MAIL   Вверх
rodnover
Дата 7.9.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Как минимум:
1. за срок жизни переменной data вы не отвечаете, поэтому она может уничтожиться в любой момент, после возврата из данной функции и data1 будет указывать на мусор;
2. для решения этой проблемы нужно использовать копирование строк. Хотя бы функцию strcpy и выделять память под data
Код

    data = new char[size];

3. 
Код
data1==data
 - сравнивает указатели, а не строки. сравнивать char * можно так strcmp

Это сообщение отредактировал(а) rodnover - 7.9.2011, 13:09
PM MAIL   Вверх
boostcoder
Дата 7.9.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(olegarh @  7.9.2011,  12:59 Найти цитируемый пост)
        static char* data1='\0';
        static bool fl=0;

ну так это же статики.
PM WWW   Вверх
olegarh
Дата 7.9.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет




rodnover, Это не меняет того что первые принты показывают что data = data1 хотя присваиваний там нет
это как то объяснить можете?

boostcoder, ии?? что не так?

Это сообщение отредактировал(а) olegarh - 7.9.2011, 13:15
PM MAIL   Вверх
rodnover
Дата 7.9.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Потому что вам везет и адрес куда указывает data не меняется, вы просто меняете текст расположенный по адресу указываемому data.

Для быстрого примера попробуйте:

Код

    static void OutXML (char* data)
    {
        static char data1[1000]; //Указываем область, которой точно хватит
        static bool fl=0;
//                printf ("\nДата - %s",data);//когда дата меняется по идее data1 должна остаться старой, но получается что она равна data хотя никаких присваиваний я не делаю
//        printf ("\nДата - %s",data1);
//        printf ("\nфлаг - %d",fl);
    
        if ((strcmp(data1, data)) && (fl==0)){ // Сравниваем текст, а не указатели
        {
                        printf ("\nцикл1\n");//выполняем какие то действия
            strcpy(data1, data); // Копируем сам текст, а не указатель
            fl=1;
        }
        if ((!strcmp(data1, data)) && (fl==0)){ // Сравниваем текст, а не указатели
            printf ("\nцикл2\n");//выполняем какие то действия
            
            fl=1;
        }
        if ((!strcmp(data1, data)) && (fl==1)) // Сравниваем текст, а не указатели
        {
            printf ("\nцикл3\n");
            
        }
        if ((strcmp(data1, data)) && (fl==1)) // Сравниваем текст, а не указатели
        {
            printf ("\nцикл4\n");
            data1=data;
            fl=0;
        }
    }


извиняюсь за возможные опечатки - копипаста. smile

Это сообщение отредактировал(а) rodnover - 7.9.2011, 13:24
PM MAIL   Вверх
olegarh
Дата 7.9.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет



Попробывал, получилось что data1 на протяжении всей программы не изменилось и осталось равно начальному значению smile 

Еще варианты есть? smile 
PM MAIL   Вверх
Леопольд
Дата 8.9.2011, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



olegarh, стоит попробовать std::string...


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
rodnover
Дата 8.9.2011, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Код


//============================================================================
// Name        : test.cpp
// Author      : rodnover
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <stdio.h>
#include <string.h>

static void OutXML(char* data)
{
    static char data1[1000]; //Указываем область, которой точно хватит
    static bool fl = 0;
    //                printf ("\nДата - %s",data);//когда дата меняется по идее data1 должна остаться старой, но получается что она равна data хотя никаких присваиваний я не делаю
    //        printf ("\nДата - %s",data1);
    //        printf ("\nфлаг - %d",fl);

    if ((strcmp(data1, data)) && (fl == 0)) // При выполнении этого блока всегда выполняется блок, который чуть ниже, так как data1 будет равно data и fl установлен в 1
    { // Сравниваем текст, а не указатели
        printf("\nцикл1\n");//выполняем какие то действия
        strcpy(data1, data); // Копируем сам текст, а не указатель
        fl = 1;
    }
    if ((!strcmp(data1, data)) && (fl == 0))
    { // Сравниваем текст, а не указатели
        printf("\nцикл2\n");//выполняем какие то действия

        fl = 1;
    }
    if ((!strcmp(data1, data)) && (fl == 1)) // Вот этот блок всегда будет выполняться вместе с первым
    {
        printf("\nцикл3\n");

    }
    if ((strcmp(data1, data)) && (fl == 1)) // Сравниваем текст, а не указатели
    {
        printf("\nцикл4\n");
        strcpy(data1, data);
        fl = 0;
    }
    //    printf ("\nДата - %s",data);//когда дата меняется по идее data1 должна остаться старой, но получается что она равна data хотя никаких присваиваний я не делаю
    //    printf ("\nДата - %s",data1);
    //                printf ("\nфлаг - %d",fl);
}

int main()
{
    char Data[500] = "Test";

    strcpy(Data, "Test");
    OutXML(Data);

    strcpy(Data, "T2");
    OutXML(Data);
    strcpy(Data, "Test");
    OutXML(Data);
    OutXML(Data);
    return 0;
}


Код избавляющий от ошибки выполнения двух блоков примерно такой:

Код

//============================================================================
// Name        : test.cpp
// Author      : rodnover
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <stdio.h>
#include <string.h>

static void OutXML(char* data)
{
    static char data1[1000]; //Указываем область, которой точно хватит
    static bool fl = 0;
    //                printf ("\nДата - %s",data);//когда дата меняется по идее data1 должна остаться старой, но получается что она равна data хотя никаких присваиваний я не делаю
    //        printf ("\nДата - %s",data1);
    //        printf ("\nфлаг - %d",fl);

    if ((strcmp(data1, data)) && (fl == 0))
    { // Сравниваем текст, а не указатели
        printf("\nцикл1\n");//выполняем какие то действия
        strcpy(data1, data); // Копируем сам текст, а не указатель
        fl = 1;
    } else if ((!strcmp(data1, data)) && (fl == 0))
    { // Сравниваем текст, а не указатели
        printf("\nцикл2\n");//выполняем какие то действия

        fl = 1;
    } else if ((!strcmp(data1, data)) && (fl == 1)) // Сравниваем текст, а не указатели
    {
        printf("\nцикл3\n");

    } else if ((strcmp(data1, data)) && (fl == 1)) // Сравниваем текст, а не указатели
    {
        printf("\nцикл4\n");
        strcpy(data1, data);
        fl = 0;
    }
    //    printf ("\nДата - %s",data);//когда дата меняется по идее data1 должна остаться старой, но получается что она равна data хотя никаких присваиваний я не делаю
    //    printf ("\nДата - %s",data1);
    //                printf ("\nфлаг - %d",fl);
}

int main()
{
    char Data[500] = "Test";

    strcpy(Data, "Test");
    OutXML(Data);

    strcpy(Data, "T2");
    OutXML(Data);
    strcpy(Data, "Test");
    OutXML(Data);
    OutXML(Data);
    return 0;
}


P.S.  в коде выше на пару сообщений, я, оказывается, лишнюю фигурную скобочку поставил. извиняюсь. smile

P.P.S. Если С++, то соглашусь, что лучше использовать стандартные стринги.

Это сообщение отредактировал(а) rodnover - 8.9.2011, 08:34
PM MAIL   Вверх
olegarh
Дата 8.9.2011, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет



так у тебя в коде char а у меня char*  с которым не работает
PM MAIL   Вверх
olegarh
Дата 8.9.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 6.2.2010

Репутация: нет
Всего: нет



Цитата(Леопольд @  8.9.2011,  07:37 Найти цитируемый пост)
 std::string.


Сделал так) все работает короче)
всем спасибо
PM MAIL   Вверх
rodnover
Дата 8.9.2011, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Цитата(olegarh @  8.9.2011,  18:00 Найти цитируемый пост)
так у тебя в коде char а у меня char*  с которым не работает

В этом у тебя и ошибка размер char * = 4 байта (для 32 битной системы). Содержит АДРЕС в памяти на строку. Он не копирует строку, он сохраняет в data1 адрес строки data. Когда ты меняешь строку в data - адрес не меняется, а значит data1 указывает на текст, который ты уже изменил. Вот и всё.  Со string, конечно, работает (и это лучший вариант), потому что он сохраняет не адрес, а последовательность символов.

Совет:
Разбирайтесь в С++ и указателях.


Это сообщение отредактировал(а) rodnover - 8.9.2011, 19:10
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1240 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.