Имя: Пароль:
IT
Админ
Кто шарит в с++ подскажите
0 ПульсЪ
 
24.04.12
00:20
Почему не работает:

объявлена глобальная переменная: char ffind[1];


char x;
strcpy(ffind, find->Text.c_str());
x =  *ffind  ;
//ShowMessage(x);

int i=10;

for (i = 1; i < 10; i++);
       if (mas[i] = x)
               ShowMessage("е");

выводит ккой то бред, типа всегда находит значение, хотя его может и не быть
24 smaharbA
 
24.04.12
01:12
x[0]='\0';
25 smaharbA
 
24.04.12
01:13
mas[i] = x --> mas[i] == x
26 smaharbA
 
24.04.12
01:14
а так

char * xxx = strchr ( mas, x[0] );
if (xxx != NULL)
27 ПульсЪ
 
24.04.12
01:14
это тогда еще переменную заводить ?
28 ПульсЪ
 
24.04.12
01:16
жесть какая то )) я просто помню что я так делал, выводил в одном мессаг боксе переменные + строки в ковычках, но прогу стер, поскольку самый первый опыт.. вот теперь не могу вспомнить как было
29 ПульсЪ
 
24.04.12
01:21
а, там был лонг
30 ПульсЪ
 
24.04.12
01:47
во блин, сделал так

for (i = 0; i < 10; i++)

       if (mas[i] == x[1])
       {
       AnsiString msg = i;
       ShowMessage("в позиции: "+msg+" обнаружен элемент"+x[1]); }
       //ShowMessage("апапывв"+msg); }
31 ПульсЪ
 
24.04.12
01:47
точнее так)  AnsiString msg = i+1;
32 smaharbA
 
24.04.12
01:56
правильнее ( отбросив условности )

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

int main ()
{
   char x;
   char mas[] = "abcdef";
   char * ffind = NULL;
   char find[] = "assax";
   char * xxx = NULL;
   char * t = NULL;
   ffind = ( char * ) malloc ( sizeof ( char * ) * strlen ( find ) );
   ffind [ 0 ] = '\0';
   strcpy( ffind, find );
   x =  * ffind;
   int i = 0;
   xxx = strchr ( mas, x );
   t = ( char * ) malloc ( sizeof ( char * ) );
   t [ 0 ] = x;
   printf ("%sind %s in %s\n", xxx ? "F" : "No f", t, mas );
   free ( t );
   free ( ffind );
return 0;
}
33 badboychik
 
24.04.12
05:49
нафига тебе нужен С++  ? Дрова писать собрался что ли
Есть человеческие языки - ява/C#
34 spock
 
24.04.12
06:38
а холивар будет?
35 spock
 
24.04.12
06:49
а тоже отмечусь :)

(32)вот в этом:
ffind = ( char * ) malloc ( sizeof ( char * ) * strlen ( find ) );
сдается мне, здесь не то, что задумывалось. Ну в смысле расточительно как-то.
36 spock
 
24.04.12
06:53
(0)вот тут тоже бяда:
char ffind[1]; // массив под один элемент, посути тут влезет только '\n'
char x;

strcpy(ffind, find->Text.c_str()); // вот тут Text явно же std::string, работай с ним вместо указателей и массивов + если в Text есть хоть что-то, то вылезаем за пределы памяти, выделенной под ffind - будет бдздынь.
37 DimVad
 
24.04.12
07:17
(33) +100500 . Скажем так, количество рабочих мест, где нужны "плюсы" будет продолжать сокращаться. И учить его впрок - бесполезно. Очень специфичная штучка, надо быть все время "в потоке". Я около 3-х лет зарабатывал на жизнь тем, что писал на MS C++ 6-я версия, интерфейсы на MFC. А сейчас с трудов врубаюсь во все это :
"ffind = ( char * ) malloc ( sizeof ( char * ) * strlen ( find ) );"

Помню, спросил у одного линуксовода, на чем чем можно писать бухгалтерию и вообще учетные задачи под линуксом. Он мне сказал - "Как на чем, на C++, конечно ! Куда лучше 1С - что хочешь, то и напишешь !" Мне тогда чего-то не захотелось...
38 sda553
 
24.04.12
07:20
(37) Надо знать такие вещи любому прогу. Не столько сам язык, сколько понимание, где адрес, где ссылка, сколько памяти может сожрать действо и т.п. С сишарпом этого понимания нет
39 DimVad
 
24.04.12
07:59
(38) Изучить работу с указателями можно и на более простых вещах, чем С++. Кста, на C# вполне можно писать "неуправляемый код" примерно в таком же стиле, если очень хочется. Решит чел на нем пару задачек, и поймет смысл всех этих распределялок памяти. И меньше времени потратит, чем на С++, и больше шансов на получение полезных знаний.

А С++ - штука огромная, рассчитана на совсем другой стиль программирования (об этом хорошо пишет Бьерн), и для изучения работы с указателями имеет много подводных камней. Очень часто память в "плюсах" распределяется совсем не так, как это предполагает программист. ИМХО - просто вузы не успевают за новыми технологиями, вот и впаривают вот это "старперство".
40 ПульсЪ
 
24.04.12
08:01
я смотрю тут доброе утро )) ща скажу пробелему, всю ночь бьюсь, подскажите почему, уже все прополоскал. Сортирую бинарным поиском

void __fastcall TForm1::Button9Click(TObject *Sender)
{
int first=0,last=9, mid;
strcpy(ffind, find->Text.c_str());

//char *c = new char [10];
//AnsiString  mas;
//strcpy(c,mas.c_str());


char *key = ffind;
char *sortedArray[10]={"0","1","2","3","4","5","6","7","8","9"};

// for (int i = 1; i < 10; i++)
//sortedArray[i] = mas[i];

while (first <= last)
{int mid = (first + last) / 2;
 if(strcmp(key, sortedArray[mid]) > 0)
       first = mid + 1;
 else if
       (strcmp(key, sortedArray[mid]) < 0)
      last = mid - 1;
 else {ShowMessage (mid+1);
       break;}
      }
 //ShowMessage ("ss");
}

так работает, но у меня глобальная переменная char mas[10]; в ней забит текст из эдит и нужно что бы из mas поиск рабил. Я понимаю что несовпадение типов, но как конвертуть из mas в mas* ?
41 sda553
 
24.04.12
08:05
&mas[0]
42 DimVad
 
24.04.12
08:08
(40) Или явное преобразование типов (char *)mas . Или преобразование типов в стиле "плюсов" (ведь mas - это константный указатель).
43 ПульсЪ
 
24.04.12
08:08
// for (int i = 1; i < 10; i++)
//sortedArray[i] = &mas[i];

так сделал, компилирует, но потом когда поиск юзаю вылетает (
44 ПульсЪ
 
24.04.12
08:14
(42) а как прописать ?
45 ПульсЪ
 
24.04.12
08:17
char *mas = mas; сделал так, но ругается на
46 ПульсЪ
 
24.04.12
08:17
if(strcmp(key, mas[mid]) > 0)
47 ПульсЪ
 
24.04.12
08:21
и так не рабит:

for (int i = 1; i < 10; i++)
strcat(sortedArray, (char*) mas[i]);
48 DimVad
 
24.04.12
08:23
Есть обычный указатель типа char *p . И есть массив типа char mas[100] . С точки зрения плюсов - это разные типы, хотя по факту и там и там - просто адреса (это к нашему разговору с sda553 по поводу изучения работы с указателями). Есть стандартное преобразование в стиле "классический С" :

p = (char *)mas;
Есть явные преобразования указателей в стиле "плюсов" (не помню синтаксиса, не любил ими пользоваться).

Твой код я разбирать не буду - у меня мозг еще спит, и я на пару с ним сейчас БП обновляю, но на первый взгляд попробуй:

for (int i = 1; i < 10; i++)
strcat(sortedArray, (char*) mas);
49 DimVad
 
24.04.12
08:25
В последней стройке - "(char*) mas" а не "(char*) mas[i]". Какой смысл в "(char*) mas[i]" ? Что, берем ЭЛЕМЕНТ МАССИВА, и используем как чаровский адрес ?!!
50 ПульсЪ
 
24.04.12
08:26
логично, просто я уж оч много чего перебрал )

попробывал твоим способом

[C++ Error] Unit1.cpp(227): E2034 Cannot convert 'char * *' to 'char *'
51 spock
 
24.04.12
08:27
(40)а почему ты сделал массив указателей: char *sortedArray[10]={"0","1","2","3","4","5","6","7","8","9"};

Может нужно просто массив: char sortedArray[10]={'0','1','2','3','4','5','6','7','8','9'};
52 ПульсЪ
 
24.04.12
08:27
(51) Массив рандомом генерится и заносится в эдит
53 ПульсЪ
 
24.04.12
08:27
+ эти строчки я делал просто для проверки бинарного поиска
54 ПульсЪ
 
24.04.12
08:30
у меня он и так обычный массив, но с обычным не рабит strcmp
55 spock
 
24.04.12
08:31
(52)так я у тебя в (40) не вижу использования mas.
Че не работает-то? :)
56 ПульсЪ
 
24.04.12
08:32
вот так задается mas, это глобальная переменная

 Randomize();
       int i;
       int x;
       char a;

       massive->Clear();
        srand(time (NULL));
       for(i=0;i<10;++i)
       {int x= 48+ rand() %9;
       a = x;
        mas[i] = x;
        massive->Text = massive->Text + (a); }
57 ПульсЪ
 
24.04.12
08:32
а не работает (40)
58 spock
 
24.04.12
08:38
(57)Покажи код, который ты хочешь запустить. Потому как в (40) у тебя написано "так работает, но у меня глобальная переменная char ...". Ничего не понятно..
59 ПульсЪ
 
24.04.12
08:39
int first=0,last=9, mid;
strcpy(ffind, find->Text.c_str());

char *key = ffind;

for (int i = 1; i < 10; i++)
strcpy(sortedArray[i], (char*) mas);


while (first <= last)
{int mid = (first + last) / 2;
 if(strcmp(key, sortedArray[mid]) > 0)
       first = mid + 1;
 else if
       (strcmp(key, sortedArray[mid]) < 0)
      last = mid - 1;
 else {ShowMessage (mid+1);
       break;}
      }
 //ShowMessage ("искомый элемент не найден");
60 spock
 
24.04.12
08:39
+58 если mas - это char mas[10], то здесь у тебя массив 10-ти чаров или строка из 9-ти символов?
61 ПульсЪ
 
24.04.12
08:41
for (int i = 1; i < 10; i++)
strcpy(sortedArray[i], (char*) mas);

загвоздка тут, не конвертнуть из char в *char
62 spock
 
24.04.12
08:49
(61)sortedArray что такое? Как объявлена?
63 ПульсЪ
 
24.04.12
08:52
char *sortedArray[10];//={"0","1","2","3","4","5","6","7","8","9"};
64 ПульсЪ
 
24.04.12
08:52
char *sortedArray[10]; так
65 Jstunner
 
24.04.12
08:54
Какая задача-то?
66 ПульсЪ
 
24.04.12
08:55
(65) 40
67 Jstunner
 
24.04.12
08:59
Неиспользование плюсов принципиально?
68 spock
 
24.04.12
09:00
(64)таким образом ты выедлил место под 10-ть указателей. Место под строки ты не выделял.
69 ПульсЪ
 
24.04.12
09:01
каких плюсов? мне главное что б работало, а как работает уже разберусь
70 Jstunner
 
24.04.12
09:03
bool stringCompare( const string &left, const string &right ){
  for( string::const_iterator lit = left.begin(), rit = right.begin(); lit != left.end() && rit != right.end(); ++lit, ++rit )
     if( tolower( *lit ) < tolower( *rit ) )
        return true;
     else if( tolower( *lit ) > tolower( *rit ) )
        return false;
  if( left.size() < right.size() )
     return true;
  return false;
}

sort( strs.begin(), strs.end(), stringCompare );

strs - вектор строк
71 ПульсЪ
 
24.04.12
09:04
это что то новое и тут вроде чего то не хватает
72 ПульсЪ
 
24.04.12
09:06
не я такое еще туго понимаю, мне лучше мой способ допилить )
73 DimVad
 
24.04.12
09:10
(72) А это и есть настоящие плюсы. И основатель С++ рекомендовал как раз такой стиль. А Ваш способ - это способ С с заморочками по типам...

Я не понял, что такое mas ? Я думал - массив символов, поэтому и говорил про (char *)mas. Это массив чего ?
74 DimVad
 
24.04.12
09:11
А вообще, конечно, не понятно, почему Вы создали эту тему на форуме 1С-ников...
75 spock
 
24.04.12
09:12
for(int i = 0; i < 10; i++)
{
  sortedArray[i] = new char[2];
  sortedArray[i][0] = mas[i];
  sortedArray[i][1] = '\n';
}

пишу на коленке, мож где ошибся. Потом нужно будет освободить память delete'ом.
76 ПульсЪ
 
24.04.12
09:13
(73) вот так я формирую mas

Randomize();
      int i;
      int x;
      char a;

      massive->Clear();
       srand(time (NULL));
      for(i=0;i<10;++i)
      {int x= 48+ rand() %9;
      a = x;
       mas[i] = x;
       massive->Text = massive->Text + (a);

char mas[10]; объявляю глобально

а по поводу форума, миста единственный форум где отвечают оперативно и тут есть раздел Админ :))
77 ПульсЪ
 
24.04.12
09:27
for(int i = 0; i < 10; i++)
{
 sortedArray[i] = new char[2];
 sortedArray[i][0] = mas[i];
 sortedArray[i][1] = '\n';
 ShowMessage(sortedArray[i]);
}

так получше, но туда помимо нужного забивается и какая то дурь, из за нее соответственно и поиск не работает
78 DimVad
 
24.04.12
09:28
(76) Ага, значит mas таки массив символов. Но тогда почему

for (int i = 1; i < 10; i++)
strcpy(sortedArray[i], (char*) mas);

Ведь strcpy - это функция, которая копирует весь массив символов целиком (работает, пока не встретит нулевой код). Цикл внутри самой strcpy !
79 ПульсЪ
 
24.04.12
09:29
честно, я уже мало соображаю ) это где то на форумах вычитал
80 DimVad
 
24.04.12
09:30
Следовательно, нужно объявить mas как char mas[11], в последний символ запихнут 0 (mas[10] = '\0';), а потом один раз выполнить strcpy(sortedArray[i], (char*) mas);
81 ПульсЪ
 
24.04.12
09:32
глобальную переменную mas нельзя трогать, у меня на ней уже много чего завязано, там пол кода надо будет перелопатить (
82 ПульсЪ
 
24.04.12
09:34
а потом один раз выполнить strcpy(sortedArray[i], (char*) mas);   а что такое тогда там будет значить i ?
83 spock
 
24.04.12
09:34
(77)непонятно, какая еще дурь?
У тебя mas не 10-ти элементный чтоли?
84 ПульсЪ
 
24.04.12
09:35
десяти, ща скрин выложу
85 DimVad
 
24.04.12
09:36
strcpy - это цикл до первого встречного нуля. Если mas весь заполнен случайными символами, отличными от 0, то strcpy будет работать и дальше, уже когда mas кончиться до тех пор, пока не встретит 0. Это значит, что strcpy будет писать по памяти...

(82) Ошибка это, конечно... Я просто плохо "скопипастил". Надо
strcpy(sortedArray, (char*) mas);
86 DimVad
 
24.04.12
09:38
Ну, если нет желание добавлять к mas '\0', то можно просто отказаться от strcpy
87 DimVad
 
24.04.12
09:40
Например, чем это плохо :

for (int i = 1; i < 10; i++)
sortedArray[i] = mas[i];
88 ПульсЪ
 
24.04.12
09:41
89 ПульсЪ
 
24.04.12
09:42
(87) я вот над этим и бьюсь.
в обоих случаях:

[C++ Error] Unit1.cpp(228): E2034 Cannot convert 'char' to 'char *'
90 DimVad
 
24.04.12
09:43
А так :

for (int i = 1; i < 10; i++)
sortedArray[i] = ((char *)mas)[i];
91 ПульсЪ
 
24.04.12
09:44
аналогично
92 ПульсЪ
 
24.04.12
09:45
способ (75) близок, но туда еще что то забивается, непонятно откуда, скрины выложил в (88)
93 DimVad
 
24.04.12
09:45
А вот так :

for (int i = 1; i < 10; i++)
*sortedArray[i] = mas[i];
94 spock
 
24.04.12
09:47
(88)а положи к себе в профиль :)
95 ПульсЪ
 
24.04.12
09:48
(93) оО ща перекрещусь еще раз
96 ПульсЪ
 
24.04.12
09:48
(93) СПАСИБИЩЕ!!!!!
97 ПульсЪ
 
24.04.12
09:48
емае
98 DimVad
 
24.04.12
09:49
Пожалуйста.
99 ПульсЪ
 
24.04.12
09:49
это вот стока времени что бы вот так вот работало! ) офигеть
100 Нуф-Нуф
 
24.04.12
09:49
100
101 Нуф-Нуф
 
24.04.12
09:49
Нуф-Нуф Владыка Сотки
102 ПульсЪ
 
24.04.12
09:49
всем спасибо кто помогал )
103 ПульсЪ
 
24.04.12
09:50
вот как раз и на работу пора хД ухаха )
104 ПульсЪ
 
24.04.12
09:51
все, буду учить ссылки и указатели, туго понятно, но правда я и за с++ второй день )
105 spock
 
24.04.12
09:52
ну ты еще счетчик в цикле с 0 начни. А то это плохо-плохо: for (int i = 1; i < 10; i++)
106 ПульсЪ
 
24.04.12
09:55
ну да) это уж не проблема )
107 ПульсЪ
 
24.04.12
10:00
главное хоть чето ищет, похожее, надо только рэндом допилить что бы одинаковые числа не делал, а то бинарный поиск как я понял требует сортировки
108 ПульсЪ
 
24.04.12
10:01
всмысле символы
109 sda553
 
24.04.12
14:44
Обработка на входе принимает описанную ранее функцию myFunction, в цикле сделать из нее делает ксерокопированием 125 функций myFunction001 ...  myFunction125 у которых небольшой отличие в исходном параметре.
Какой язык кроме C++ на такое способен?
110 spock
 
24.04.12
19:07
оценил свежим взглядом:
- ждем (0) в гости еще раз, потому как "*sortedArray[i] = mas[i]" работать не будет;
- в (75) нужно внести коррективы - вместо sortedArray[i][1] = '\n'; нужно sortedArray[i][1] = 0;
111 ПульсЪ
 
24.04.12
21:33
тут _) выспался мальца) и заметил что вроде все работает, но поиск вылетает пытаться искать последний элемент..
112 ПульсЪ
 
24.04.12
21:46
еще заметил: что вот так работает

char *sortedArray[10]={"0","1","2","3","4","5","6","7","8","9"};


for (int i = 0; i < 9; i++)
*sortedArray[i] = mas[i];


а вот так нет:

char *sortedArray[10]; //={"0","1","2","3","4","5","6","7","8","9"};


for (int i = 0; i < 9; i++)
*sortedArray[i] = mas[i];
113 ПульсЪ
 
24.04.12
22:42
(111) решил, запутался в размерностях массива и числах
114 ПульсЪ
 
24.04.12
23:00
может знаете, в 1С можно сделать так:

Скрипт.Language="javascript";
Понеслась = Скрипт.eval("new Date().getTime()");

тырыпыры..

стапэ = Скрипт.eval("new Date().getTime()");


т.е. можно было замерить время работы от точки А до точки Б, знаю что можно, но как, смотрел на форумах, там как то все оч сложно )
115 ПульсЪ
 
24.04.12
23:06
все разобрался )

int s=clock();

тырыпыры..

ShowMessage(clock()-s) ;
116 ПульсЪ
 
24.04.12
23:06
#include <time.h> еще нужна
117 Xapac
 
24.04.12
23:10
а отладчик что сказал?
118 ПульсЪ
 
24.04.12
23:30
по поводу
119 Steel_Wheel
 
25.04.12
01:04
еще getTickCount() есть -- тоже меряет тики поцессора
120 Steel_Wheel
 
25.04.12
01:04
*процессора
121 spock
 
25.04.12
06:43
я же сказал, что придет опять :)
122 Xapac
 
25.04.12
20:17
(118)Такие проблеммы как в (0) решатся только отладкой. тут бестолку советовать
123 ПульсЪ
 
27.04.12
14:05
все уже разобрался, все сделал все работает ))