Просмотр полной версии : [c/c++] Новичкам: задаем вопросы
Страницы :
1
2
3
4
5
6
7
8
9
10
11
[
12]
13
14
15
16
17
18
19
20
21
22
2 _SEREGA_ 5005 статей по Delphi (aka Delphi World) раздел Интернет и сети \ Сокеты
Статьи "Сокеты 1","Сокеты 2 (Кодинг блокирующих сокетов) ", "Сокеты 3 (Кодинг неблокирующих сокетов)"
Там расписаны непосредственно прототипы функций и описание для чего они юзаются и есть небольшие примеры. Описание прототипов в сишном формате, а пример дельфовый(но разницы собой нет. Апи оно и на Марсе Апи)
Спасибо конечно но токо где эти статьи?
ппц, это уже не смешно, тебе впадлу гугл заюзать или на пару кнопок нажать?
подобное уже обсасывалось сто раз, статей уйма.
KaZ@NoVa
24.04.2009, 18:05
ss88,Не люблю копаться в чужих кодах.... Давай на словах. Имеется в виду, что надо сосканировать предложение, разбить на слова и... а дальше чо? "Заностится в бинарно дерево" по какому принципу? Если просто слова по-порядку, то просто забить слова в структуру (массив), а дальше их печатать в виде дерева (всмысле в каждой строке увеличиваем колличество распечатываемых слов в 2 раза). В этом коде слишком муторно разбираться...
char * newInt = new char[20];
newInt = "sdfdsfsdfdsf";
cout << newInt << endl;
for(int i=0; i < 300; i++, newInt++)
cout << *newInt;
учу С++ по книжке, есть вопрос.
первый цаут выводит полную строку, а второй -
sdfdsfsdfdsbasic_string::atbasic_string::copybasic _string::compare
и после самой строки там непечатных символа, которые никак не копируются.
Скажите, куда эт я залез и если изменить эту информацию по указателю - могу ли я испортить работу другой программы или подвесить свою?
Свободная память для каждой программы своя?
могу ли я испортить работу другой программы или подвесить свою
У каждого процесса свое виртуальное адрессное пространство, читаем про виртуальный режим.
sdfdsfsdfdsbasic_string::atbasic_string::copybasic _string::compare
У тебя строка sdfdsfsdfdsf длинной 12 символов, а ты выводишь данные за указателем тк i < 300 (а именно все то что лежит за этой строкой)
Так же у тебя будет тут утечка памяти вот тут
newInt = "sdfdsfsdfdsf";
Так как ты указателю который указывает на выделенную в куче память присваиваешь адрес строки которая лежит в локальном стеке ф-ции, то теряется выделенный блок памяти, правильно сделать так:
strcpy(newInt, "sdfdsfsdfdsf");
тогда наша строка будет лежать в куче.
Также не забываем вызывать delete/delete[] после того как выделенная память не нужна.
Помогите составить программу на Си, которая бы открывала текстовый файл с набором русских английских симовлов и цифр и выводила всё кроме 0-9 A-Z и a-z
Я попытался сделать вот так (программа выводящая все символы кроме 0 и 1), но что-то не работает :(((
#include <stdio.h>
#include <string.h>
#define file "C:\\aq.txt"
main()
{FILE * pfr;
char m[200];
pfr=fopen(file,"r");
if (pfr==NULL)
{printf("ошибка при открытии");
exit(-1);}
while (fgets(m,200,pfr)!=NULL);
{int i,j;
M1: if (m[i]!='0' || m[i]!='1'); // если символ неравен 0 или 1, то
printf("%S %d", m, i); // вывести его
esle (m[i]=m[i+1]); // иначе - перейти к следующему символу
goto M1; // вернуться к проверке этого символа
}
}
Mosvit
1. main() - должна возвращать тип int и иметь в конце return 1;
2. после while сразу стоит ;
3. int i,j; не надо объявлять в цикле
4. вместо goto как раз таки используется while
и ещё:
esle
:D
Помогите составить программу на Си, которая бы открывала текстовый файл с набором русских английских симовлов и цифр и выводила всё кроме 0-9 A-Z и a-z
Если не напутал, то вот поидее
#include <stdio.h>
void main()
{
FILE *in;
char ch;
in = fopen("in.txt", "r");
while(ch != EOF)
{
ch = fgetc(in);
if((ch < 48 || ch > 57) && (ch < 65 || ch > 90) && (ch < 97 || ch > 122)) printf("%c", ch);
}
fclose(in);
}
// создал указатель (?) на поток
ifstream infile;
// открыл файл
infile.open ("C:\\file2.txt");
// пытаюсь получить размер файла
int size = filesize(infile);
int filesize(ifstream infile){
infile.seekg(0, ifstream::end);
int size = infile.tellg();
infile.seekg(0);
return size;
};
но не получается.
ошибка в строке
int size = filesize(infile);
// initializing argument 1 of `int filesize2(std::ifstream)'
как передать этот указатель в функцию, чтобы она определила размер файла?
Напиши
int filesize(ifstream &infile)
draliokero
25.04.2009, 16:12
Подскажите, как в строковой переменной заменить слово на нужный мне текст.
jawbreaker
25.04.2009, 16:22
Подскажите, как в строковой переменной заменить слово на нужный мне текст.
Если нужно заменить все вхождения то так:
string s="BugblablaBugBug blabla BuBuggBug";
string oldS="Bug";
string newS="";
int last=0,i;
while (i=s.find(oldS,last),i!=string::npos)
last=i+newS.size(),
s.replace(i,oldS.size(),newS);
Если нужно заменить все вхождения то так:
string s="BugblablaBugBug blabla BuBuggBug";
string oldS="Bug";
string newS="";
int last=0,i;
while (i=s.find(oldS,last),i!=string::npos)
last=i+newS.size(),
s.replace(i,oldS.size(),newS);
как ужасно:) нет бы КМП написать..)
Юзай поиск в инете
Для ленивых вот:
// Функция заменяет в строке Src подстроку Str1 на Str2
char* Replace(char* Src,char* Str1, char* Str2)
{
int cStr1=0,cStr2=0,i;
char* buffer;
buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,lstrle n(Src)*2);
while (Str1[cStr1]) cStr1++; // считаем размер
while (Str2[cStr2]) cStr2++; // строк, можно и через lstrlen
i = InStr(&Src[0],&Str1[0]);
while(i != 0)
{
lstrcpyn(&buffer[lstrlen(buffer)],&Src[0],i);
lstrcat(&buffer[0],&Str2[0]);
lstrcpy(&Src[0],&Src[i+cStr1-1]);
i = InStr(&Src[0],&Str1[0]);
}
lstrcat(&buffer[0],&Src[0]);
lstrcpy(&Src[0],&buffer[0]);
HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,buffer );
return Src;
}
char *str;
cin >> str;
char *mm = strcpy(str, "free");
cout << mm;
почему-то выводит "free"..
а где то, что я поместил в str?
а где то, что я поместил в str?
Дак ты же перезаписываешь то что находится в str
strcpy(str, "free");
помещение строки "free" по адресу str
если хочешь чтобы было и то и другое, то юзай strcat для сложения строк
Если не напутал, то вот поидее
#include <stdio.h>
void main()
{
FILE *in;
char ch;
in = fopen("in.txt", "r");
while(ch != EOF)
{
ch = fgetc(in);
if((ch < 48 || ch > 57) && (ch < 65 || ch > 90) && (ch < 97 || ch > 122)) printf("%c", ch);
}
fclose(in);
}
Да, спасибо! Всё работает. Только в начале не void main() походу а int main()
В условии цифры это какие-то коды символов получается?
А можно ещё как-нибудь сделать запись полученого результата в текстовый файл, а то русский шрифт полохо отображается в программе? =)
Напиши в консоле >> file.txt или в коде допиши запись в другой файл.
Зачем писать int main если функция ничего не возвращает?
Если не напутал, то вот поидее
#include <stdio.h>
void main()
{
FILE *in;
char ch;
in = fopen("in.txt", "r");
while(ch != EOF)
{
ch = fgetc(in);
if((ch < 48 || ch > 57) && (ch < 65 || ch > 90) && (ch < 97 || ch > 122)) printf("%c", ch);
}
fclose(in);
}
Ну вашу ж мать... ну кто так делает? и как так вообще можно? какого хрена оно вообще работает.. это ж..
короче, по пунктам:
1)юзинг неинициализированной переменной в ch
2)в случае достижения eof-а всё равно пытаемся что-то вывести
3)ну вот обязательно надо всё не по человечески сделать: вот что тебя сподвигло на написание "<48" вместо "<'0'"?
фикс этого кода, убивающий критические баги 1 и 2:
#include <stdio.h>
void main()
{
FILE *in;
char ch;
in = fopen("in.txt", "r");
while((ch = fgetc(in)) != EOF)
{
if((ch < 48 || ch > 57) && (ch < 65 || ch > 90) && (ch < 97 || ch > 122)) printf("%c", ch);
}
fclose(in);
}
Я как бэ не программист по образованию и даже не интересующийся (особенно с++), ну да ладно...
1)юзинг неинициализированной переменной в ch
2)в случае достижения eof-а всё равно пытаемся что-то вывести
Приведи практический пример, когда мой вариант повлечет за собой ошибку
вот что тебя сподвигло на написание "<48" вместо "<'0'"?
ascii коды сподвигли
Если не напутал, то вот поидее
#include <stdio.h>
void main()
{
FILE *in;
char ch;
in = fopen("in.txt", "r");
while(ch != EOF)
{
ch = fgetc(in);
if((ch < 48 || ch > 57) && (ch < 65 || ch > 90) && (ch < 97 || ch > 122)) printf("%c", ch);
}
fclose(in);
}
Зачем изобретать велосипед когда он уже сделан?
#include <stdio.h>
#include <ctype.h>
int main() {
FILE *in;
char ch;
in = fopen("in.txt", "r");
while(ch != EOF) {
ch = fgetc(in);
if(!isalnum(ch)) {
printf("%c", ch);
}
}
fclose(in);
return 0;
}
Misha-_-rus
25.04.2009, 21:51
Нужно задав двумерную матрицу поменять в ней 1 столбец с последним, Помогите очень срочно надо.
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{ int i,mas[25][25],o,n,m,q;
printf("Yslovie 2\n ");
printf("Vvesti matricy, 1 stolbec pome9t` mestami \n ");
printf("Vvedite razmernost: ");
scanf("%d", &o);
for (n=0; n<=o; n++)
for (m=0; m<=o; m++)
{mas[n][m]=random(15)-7;}
for (n=0; n<o; n++)
{printf("\n");
for (m=0; m<o; m++)
{printf(" %d ", mas[n][m]);}}
printf("\n");
printf("\n");
printf("S drygim stolbcom: \n");
????????????????? //Здесь должен быть код которй меняет один столбец местами с последним, и выводит измененый массив
getch();
return 0;
}
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i,mas[25][25],o,n,m,tmp;
clrscr();
printf("Yslovie 2\n ");
printf("Vvesti matricy, 1 stolbec pome9t` mestami \n ");
printf("Vvedite razmernost: ");
scanf("%d", &o);
for(n=0; n<=o; n++){
for(m=0; m<=o; m++)
{
mas[n][m]=random(15)-7;
printf("%3d ", mas[n][m]);
}
printf("\n");
}
printf("S drygim stolbcom: \n");
//замена столбцов
for(i=0; i<=o; i++){
tmp=mas[i][0];
mas[i][0]=mas[i][o];
mas[i][o]=tmp;
}
for(n=0; n<=o; n++){
for(m=0; m<=o; m++)
printf("%3d ", mas[n][m]);
printf("\n");
}
getch();
return 0;
}
Я как бэ не программист по образованию и даже не интересующийся (особенно с++), ну да ладно...
Приведи практический пример, когда мой вариант повлечет за собой ошибку
ascii коды сподвигли
Неинициализированная перменная в языкам типа с++ есть очень опасное зло. Значение будет ровно таким, какое значение имела ячейка памяти. Так как переменная локальная - то лежит в стеке. Сталобыть значение может быть любым. Таким образом ты получишь магическую ошибку, которая трудновоспроизводима, ибо зависит от состояния памяти процесса(а суть в том, что EOF это просто символьное описание числа 0xFF, которое встречается в памяти довольно часто, и вполне вероятно его получить в неочищенном блоке памяти). И если бы такое приложение было комерческим, то чудесные часы дебагинга и анализа кода были бы обеспечены. Ну а потом промывка мозга на тему "почему не учтен warning C4700, который дал компилятор"
По поводу кодов - так и пиши символы, зачем ты переводишь их в коды? Чтобы сложнее было понять суть проверки? if (ch >= '0' && ch <= '9') гораздо нагляднее. Опять же использование числовых констант ацки нерекомендуется нигде и никогда. Все константы должны иметь символические имена. #define WEEK_LENGTH 7 итп. Это помогает понять контекст кода просто глянув на него, без комментариев.
ЗЫ: не учите плохому плз. ибо потом такие кодесы городят, что страшно смотреть.
у меня вопрос. Имееться две переменные типа int, к пример
int a,b; //числитель и знаменатель
как привести дробь к нормальному виду, тоесть нужно разделить a/b и присвоить к переменной. такая фишка не срабатывает:
int a,b;
float s;
s=a/b;
cout<<s;
оно округляет значения. Подскажите как решить проблемму?
у меня вопрос. Имееться две переменные типа int, к пример
int a,b; //числитель и знаменатель
как привести дробь к нормальному виду, тоесть нужно разделить a/b и присвоить к переменной. такая фишка не срабатывает:
int a,b;
float s;
s=a/b;
cout<<s;
оно округляет значения. Подскажите как решить проблемму?
ничего не удивительного ведь'=' : conversion from 'int' to 'float', possible loss of dataпоэтому надо так
float a, b;
float s;
s = a / b;
cout << s;
Ясно, получаеться для правильной работы нужно вводить числа "с точкой" : 3.0, 2.0 .....
2WALKMAN
#include<iomanip.h>
cout<<setprecision(3)<<s; //манипулятор setprecision(n) устанавливает точность вывода чисел типа float или double
Люди подскажите как создать функцию которая примет структуру и вернет массив заполненый элементами из структуры. И как потом к этому массиву обращаться из мэйн. Че то сам писал писал так ничо и не получается. Желательно примерчик простенький.
На си)
Люди подскажите как создать функцию которая примет структуру и вернет массив заполненый элементами из структуры. И как потом к этому массиву обращаться из мэйн. Че то сам писал писал так ничо и не получается. Желательно примерчик простенький.
На си)
А погуглить?
http://www.java2s.com/Tutorial/Cpp/0160__Structure/Passstructuretoafunctionasapointer.htm
v.tyshkev
26.04.2009, 15:38
При компиляции выходит сообщение об ошибке по директиве #include<.h>:
1)"Ожидается диретива предпроцессору (CS 1024)" 2)"Ожидается однострочный комментарий или признак конца строки (CS 1025)"
А вот и код:
#include <stdio.h>
#include <stdlib.h>
namespace az
{
class Program
{
int main()
{
char *Remote_IP = getenv("REMOTE_ADDR"); char *Query_String = getenv("QUERY_STRING");
printf("Content-type: text/html\n\n");
printf("<html><body><h1>Привет</h1><p>"); printf("Ваш IP: %s", Remote_IP);
printf("<p>Переданные вами параметры: %s", Query_String);
printf("</body></html>")
return 0;
}
}
}
Как от это исправить?
ппц что это ты нагородил, выкинь этот говнокод и почитай книжки.
ss88,Не люблю копаться в чужих кодах.... Давай на словах. Имеется в виду, что надо сосканировать предложение, разбить на слова и... а дальше чо? "Заностится в бинарно дерево" по какому принципу? Если просто слова по-порядку, то просто забить слова в структуру (массив), а дальше их печатать в виде дерева (всмысле в каждой строке увеличиваем колличество распечатываемых слов в 2 раза). В этом коде слишком муторно разбираться...
Судя по тем кодам, что пишут в этой теме, мой код, действительно, совсем другой, не сказал бы, что он плохой... Слова добавлялись в дерево, вполне логично, по сравнению строк на больше/меньше. Никаких стеков, массивов нельзя - это глупо, да и на это стоит ограничение, просто, в данном случае, память является самым критичным ресурсом, поэтому разрастание стека при рекурсии - недопустимая роскошь. Привожу код с нерекурсивным обходом (не самый эллегантный алгоритм, но все же...), может кому пригодится, потому что задача не самая тривиальная... Если кто захочет компилить, то это делать надо в 99-м стандарте С.
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tree_item_tag {
const char * word;
size_t count;
struct tree_item_tag *left, *right, *parent;
} tree_item_t;
void insert(tree_item_t** first_item, const char* keyword, size_t * count) {
tree_item_t** pcur = first_item, **prev = first_item;
int cmp_words;
while (*pcur != NULL) { /* searching for already inserted word inc count */
if((cmp_words=strcmp(keyword, (*pcur)->word)) == 0) {
++(*pcur)->count;
return;
}
prev = pcur;
pcur=(cmp_words<0) ? &((*pcur)->left) : &((*pcur)->right);
} /* it is the first insert of this word */
*pcur = malloc( sizeof(tree_item_t) );
(*pcur)->word = strcpy( malloc( strlen(keyword) + 1) , keyword);
(*pcur)->count = 1;
(*pcur)->parent = *prev;
(*pcur)->left = (*pcur)->right = NULL;
++(*count);
}
void printnotrec(tree_item_t* tree_item, size_t count) {
size_t cur_count = 0;
tree_item_t * pcur = tree_item, * pprev = pcur, *tmppcur;
while(cur_count != count) {
tmppcur = pcur;
if( (pcur->left==NULL && pprev!=pcur->right)
||pprev==pcur->left) {
(void)printf("%s %d\n",pcur->word, pcur->count);
++cur_count;
if( pcur->right == NULL ) {
if( pcur->parent->right == pcur ) {
pprev = pcur->parent;
pcur = pcur->parent->parent;
continue;
} else
pcur = pcur->parent;
} else
pcur = pcur->right;
}
else {
if(pprev == pcur->right)
pcur = pcur->parent;
else
pcur = pcur->left;
}
pprev = tmppcur;
}
}
int get_word(char * buf_word, size_t buf_size) {
int c; /* current read symbol */
size_t word_len = 0;
while( (c=getchar()) != EOF) {
if(isalpha( (unsigned char) c) || (word_len > 0 && c == '\'')) {
buf_word[ word_len++ ] = (unsigned char) tolower(c);
if(word_len + 1 == buf_size) break; /* return only part of word */
} else if(word_len > 0) break; /* word can be returned */
}
if(word_len > 0) {
buf_word[ word_len ]= '\0';
return 1;
} else return 0;
}
int main(void) {
tree_item_t *first_item = NULL;
size_t buf_size = 50; /* must be bigger than 1 */
size_t count = 0;
char * buf_word = malloc(buf_size);
while(get_word(buf_word, buf_size))
insert(&first_item, buf_word,&count);
printnotrec(first_item,count);
printf("%d\n",count);
return EXIT_SUCCESS;
}
А погуглить?
http://www.java2s.com/Tutorial/Cpp/0160__Structure/Passstructuretoafunctionasapointer.htm
Спасибо за наводку, структуру передал, а как теперь вернуть массив?
Спасибо за наводку, структуру передал, а как теперь вернуть массив?
создай в куче и возвращай указатель на него.
Может я что то не так делаю, вот мой код может кто нить подскажет что не так?
#include <stdio.h>
#include <time.h>
struct tm intime; // создаю структуру типа tm которая описана в time.h
int* funct(struct tm *p); // обьявление функции
int* funct(struct tm *p) // описание
{
int temp[7]; // создаем массив который вернется
temp[0] = p.tm_sec; // присваиваем элементам массива, значения структуры
temp[1] = p.tm_min; // ..
temp[2] = p.tm_hour;
temp[3] = p.tm_mday;
temp[4] = p.tm_mon;
temp[5] = p.tm_year;
temp[6] = '\0'; // закрываем массив
return temp; // возвращаем массив
}
int main (void)
{
int *temp2; // создаем указатель на массив который получим из функции
{
intime.tm_sec=10; // присваиваем значения элементам нашей входной структуры
intime.tm_min=19;
intime.tm_hour=20;
intime.tm_mday=14;
intime.tm_mon=5;
intime.tm_year=109;
}
temp2 = funct(&intime); // пытаемся отправить структуру в функцию и ничего не выходит ((
return 0;
}
Compiling source file(s)...
gps.cpp
gps.cpp: In function `int* funct(tm*)':
gps.cpp:9: error: `tm_sec' has not been declared // здесь непонимаю почему ругается, ведь мы обьявили структуру в файле <time.h>
gps.cpp:9: error: request for member of non-aggregate type before ';' token
gps.cpp:10: error: `tm_min' has not been declared
gps.cpp:10: error: request for member of non-aggregate type before ';' token
gps.cpp:11: error: `tm_hour' has not been declared
gps.cpp:8: warning: address of local variable `temp' returned // здесь вроде ругается что возвращаем локальную а не глобальную переменную
temp[0] = p->tm_sec; // присваиваем элементам массива, значения структуры
temp[1] = p->tm_min; // ..
temp[2] = p->tm_hour;
temp[3] = p->tm_mday;
...
насчет переменной локальной - она создается в стеке, а стек это такайа штука, которая после выхода из подпрограммы может быть использована другой подпрограммой - следовательно и данные будут испорчены.
Может я что то не так делаю, вот мой код может кто нить подскажет что не так?
не знаю, сколько вам лет, но я ТАКОГО даже в школе не писал ))) Вас самих не пугает ТАКОЕ??? "Сколько не делай из говна конфету, получается либо слдкое говно, либо говняная конфета" (с) Я
Меня ТАКОЕ не пугает, просто потому что я неопытен в этой сфере. Если несложно можешь обьяснить конкретно что именно тебя так пугает в этом коде?
Я учту это на будущее. Мне 21)
CHIP:)), удаляй к чертям весь этот код, бери книжку по сям и садись читать её сначала и ну хотя бы страницы до сотой....
temp[6] = '\0'; // закрываем массив
убило
Меня ТАКОЕ не пугает, просто потому что я неопытен в этой сфере. Если несложно можешь обьяснить конкретно что именно тебя так пугает в этом коде?
Я учту это на будущее. Мне 21)
int* funct(struct tm *p); // обьявление функции
int* funct(struct tm *p) // описание
{
Я..... теперь я знаю..... Я на свете есть.....
Обьявление функции до ее описания обычно делается лишь затем, чтобы компилятор знал, какие у нее параметры и как правильно ее вызвать... А то, что вы написали - это чистой воды маразм. Т.е. надо обьявлять функцию до описания, если она используется в местах, где она еще не описана.
temp[6] = '\0'; // закрываем массив
Это что-то из космоса, или вас просто жестоко обманули...
{
intime.tm_sec=10; // присваиваем значения элементам нашей входной структуры
....
}
Это, конечно, не ошибка, но какого черта объявлять блок внутри блока, если толку от этого никакого??? + ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ, ОСОБЕННО, В ЯЗЫКАХ БЕЗ УПРАВЛЕНИЯ ДОСТУПОМ И ОБЛАСТЯМИ ВИДИМОСТИ (ТАКИХ, КАК С и ПАСКАКАЛЬ :) ), - ЭТО БОЛЬШОЕ ВСЕЛЕНСКОЕ ЗЛО!
Еще, очень советую придерживаться хоть какого-то стиля оформления кода, это вам же на руку..... Похоже, что вы не писали никогда ничего серьезного.....
И ЕЩЕ, ОБЬЯСНИТЕ, ЗАЧЕМ ОБЬЯВЛЯТЬ КАКОЙ-ТО МАССИВ ИЗ "МАГИЧЕСКИХ" СЕМИ ЭЛЕМЕНТОВ?????? ВАМ НЕКОШЕРНО ЮЗАТЬ СТРУКТУРУ tm? (шифт я держал, т.к. слов просто не хватает :) )
ss88
Спасибо вам за разяснения, я учту. Естественно я раньше не писал ничего серьезного иначе меня небыло бы в этой теме.
Структуру мне юзать некошерно потому что, мне нужна будет в дальнейшем символьная строка с временем, датой и другими вещами. Ладно не будем больше флудить, пошел читать книжки...
Что-то такое я и подозревал, но цифры в символьном виде представляются, отнюдь, не так, так что, если вы надеялись без напрягов все преобразовать в строку, то спешу вас разочаровать....... Не НУЛем единым, так сказать ))))
Покажите пожалуйста пример простой (желательно консольной) программы, которая переходит по ссылке и берет ее содержимое (сокеты). Желательно с хорошими коментариями
awdrg И что делает с этим содержимым? Если сохраняет в файл, то юзай UrlDownloadToFile из urlmon
Есть просто считывает данные, то юзай InternetConnect и тому подобные из wininet
В 5005 статей по делфи хорошо описаны эти функции и кусочки програм на делфи есть, но принчиписально они ничем не отличаются от С++
А если тебе нужна именно реализация на сокетах, то поищи в форуме гдето я кидал сообщение, как общаться с сервером через сокеты.
Также могу порекомендовать открыть исходник моей прожки HTTP Sender которую я выкладывал в этом разделе. Он хоть и на делфи, но там Реалищована отсылка пакета Web серверу и получение ответа от него.
-m0rgan-
27.04.2009, 17:31
Такой вопрос:
Учу С++
коппилятьо говорит:
"ttestt.exe": Загружено: "C:\Documents and Settings\-bug1z-\Мои документы\Visual Studio 2008\Projects\ttestt\Debug\ttestt.exe", Символы загружены.
"ttestt.exe": Загружено "C:\WINDOWS\system32\ntdll.dll"
"ttestt.exe": Загружено "C:\WINDOWS\system32\kernel32.dll"
"ttestt.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8 b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll"
"ttestt.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8 b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcp90d.dll"
Программа "[3912] ttestt.exe: Машинный код" завершилась с кодом 0 (0x0).
код программы:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int z[10];
for(int i=1; i<9; i++){
z[i]=i;
cout<<i;
return 0;
}
}
В чём проблема?
почему программа завершается с нолём??
спасибо!
Потому что код програграммы выполнился и return 0;
ты же сам написал.. по англ. return - вернуть.
Или я чего то недопонял, опиши поподробнее проблему..
-m0rgan-
27.04.2009, 17:46
Без return тор же самое =//
Аа и еще заметил тока, у тебя при первой интерации цикла, сразу должен вылететь ноль.
Вот так правильней, не туда поставил }.
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int z[10];
for(int i=1; i<9; i++){
z[i]=i;
cout<<i;
}
return 0;
}
Такой вопрос:
Учу С++
коппилятьо говорит:
"ttestt.exe": Загружено: "C:\Documents and Settings\-bug1z-\Мои документы\Visual Studio 2008\Projects\ttestt\Debug\ttestt.exe", Символы загружены.
"ttestt.exe": Загружено "C:\WINDOWS\system32\ntdll.dll"
"ttestt.exe": Загружено "C:\WINDOWS\system32\kernel32.dll"
"ttestt.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8 b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll"
"ttestt.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8 b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcp90d.dll"
Программа "[3912] ttestt.exe: Машинный код" завершилась с кодом 0 (0x0).
код программы:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int z[10];
for(int i=1; i<9; i++){
z[i]=i;
cout<<i;
return 0;
}
}
В чём проблема?
почему программа завершается с нолём??
спасибо!
"Ноль" означает удачное завершение программы (без ошибок)
если бы показывало другое число, значит программа завершилась(закрылась) неудачно (с ошибкой).
-m0rgan-
27.04.2009, 18:01
спс...но программа всё равно завершается =(
то есть мелькнуло консольное окно в нём 123456789 и оно исчезает и в окне компилятора появляется тот же код =((
спс...но программа всё равно завершается =(
то есть мелькнуло консольное окно в нём 123456789 и оно исчезает и в окне компилятора появляется тот же код =((
ааа ну так бы и написали, а то фиг поймешь о чем речь)
перед ретурном надо написать system("PAUSE"); // Работает только в Windows
и тогда после 123456789 появится надпись "Press any key to continue" и после нажатия любой кнопки программа закроется.
Программа выполнилась и завершилась, чтобы окно осталось с результатом нужно приостановить ее, например прописав функцию ввода символа. в с++ не знаю как, но думаю прокатит:
#include<conio.h>
...
getch();
return 0;
}
-m0rgan-
27.04.2009, 18:06
Спасибо!
теперь всё ок!
-m0rgan-
27.04.2009, 18:21
ctrl+f5
Спасибо, я знаю как компилировать программу...
Он наверно хотел сказать alt+F5, в BC таким образом показывается консоль..
-m0rgan-
27.04.2009, 18:27
Вот теперь возник такой вопрос:
Как записть данные в файл?
Скажем вот мой код:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int z[100000];
for(int i=1; i<100000; i=i+2){
z[i]=i;
cout<<i;
cout<<"\n";
}
system("PAUSE");
return 0;
}
как теперь записать выведенные данные в файл скажем 1.txt ?
То есть из масива..
Вот теперь возник такой вопрос:
Как записть данные в файл?
Скажем вот мой код:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int z[100000];
for(int i=1; i<100000; i=i+2){
z[i]=i;
cout<<i;
cout<<"\n";
}
system("PAUSE");
return 0;
}
как теперь записать выведенные данные в файл скажем 1.txt ?
То есть из масива..
Книжку лучше возьми открой да почитай)) там всё написано!)
в с++ не знаю как
cin.get();
-m0rgan-
27.04.2009, 19:04
Вот есть способ:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int z[100000];
for(int i=1; i<10; i=i+2){
z[i]=i;
cout<<i;
cout<<"\n";
ofstream out_file("C:\\1.txt");
if(!out_file) cout << "error";
else out_file << i;
}
system("PAUSE");
return 0;
}
Только оно записывает только последнее значение, а как сделать, чтоб записывало ВСЁ ??
а может потому, что 0 - это нормальное завершение программы?)
пс: тоже прочитай начало чего-нибудь по сям..
Только оно записывает только последнее значение, а как сделать, чтоб записывало ВСЁ ??
Ты в каждой итерации цикла открываешь файл на запись.
Вынеси это из цикла.
ofstream out_file("C:\\1.txt");
Есть необходимость использовать бинарные деревья, что лучше - структуры или классы?
rudvil, вообще структуры..
а какова цель использования двоичного дерева?
rudvil, вообще структуры..
а какова цель использования двоичного дерева?
Создание дерева из токенов (пытаюсь написать интерпритатор).
а что ты хочешь хранить в структурках?
а что ты хочешь хранить в структурках?
Что-то вроде этого
struct Tree {
char type;
void* Data;
Tree* Left;
Tree* Right;
};
rudvil, знаешь.. есть такая замечательная хренька.. массив...
где потомками a[i] являтся a[2*i]-левый и a[2*i+1]-правый (нумерация с 1).. так оно сильно быстрее работает.
rudvil, знаешь.. есть такая замечательная хренька.. массив...
где потомками a[i] являтся a[2*i]-левый и a[2*i+1]-правый (нумерация с 1).. так оно сильно быстрее работает.
спс, попробую)
Хотя в глубине души что-то мне подсказывает что это не самый хороший вариант.
>>Хотя в глубине души что-то мне подсказывает что это не самый хороший вариант.
Это самый хороший вариант.. поверь)
а если не хочешь верить - сравни время работы такой имплементации и со структурками
rudvil, знаешь.. есть такая замечательная хренька.. массив...
где потомками a[i] являтся a[2*i]-левый и a[2*i+1]-правый (нумерация с 1).. так оно сильно быстрее работает.
А ты знаешь, для чего используются такие структуры данных как список, деревья? Ты будешь каждый раз перевыделять память как только у тебя массив закончится? Не говоря уже о понятности и читабельности кода.
спс, попробую)
Хотя в глубине души что-то мне подсказывает что это не самый хороший вариант.
Попробовать можно только лишь с той целью, чтобы убедиться, что так делать не нужно. При написании интерпретаторов, компиляторов используются такая структура данных как map(хэш-таблица, ассоциативный массив), реализованная в виде бинарного дерева поиска, как правило использующая для балансировки алгоритм красно-черных деревьев. Надеюсь не сильно запутал, но структуры данных нужно знать. Это основа.
А ты знаешь, для чего используются такие структуры данных как список, деревья? Ты будешь каждый раз перевыделять память как только у тебя массив закончится? Не говоря уже о понятности и читабельности кода.
Попробовать можно только лишь с той целью, чтобы убедиться, что так делать не нужно. При написании интерпретаторов, компиляторов используются такая структура данных как map(хэш-таблица, ассоциативный массив), реализованная в виде бинарного дерева поиска, как правило использующая для балансировки алгоритм красно-черных деревьев. Надеюсь не сильно запутал, но структуры данных нужно знать. Это основа.
Нет не запутал)
У меня тоже сомнения возникли насчет массива т.к. я не думаю что тот-же php или python используют массив)))
rudvil, знаешь.. есть такая замечательная хренька.. массив...
где потомками a[i] являтся a[2*i]-левый и a[2*i+1]-правый (нумерация с 1).. так оно сильно быстрее работает.
Нашел, что посоветовать, наверное, ты решил проблему разработчиков за последние лет 30, вот только нихрена не решил, не надо такой ереси советовать.
Попробовать можно только лишь с той целью, чтобы убедиться, что так делать не нужно. При написании интерпретаторов, компиляторов используются такая структура данных как map(хэш-таблица, ассоциативный массив), реализованная в виде бинарного дерева поиска, как правило использующая для балансировки алгоритм красно-черных деревьев. Надеюсь не сильно запутал, но структуры данных нужно знать. Это основа.
Полностью согласен. RB деревья активно используются и не зря, они относительно баллансированы, да и этот вид структуры данных имеет важное свойство - он, сцуко сортированный :) Хотя, видя, какие тут советы дают (обычно складывается впечатление, что их дают не программеры, а какие-то трактористы), этот пост мне понравился - все основательно и правильно.
Нет не запутал)
У меня тоже сомнения возникли насчет массива т.к. я не думаю что тот-же php или python используют массив)))
Ты все правильно почувствовал, такие подходы, как совет с массивами - это глупа провокация, сделанная человеком, который, судя по всему не много смыслит в данной предметной области.
ну, уважаемые мастера, прошу - посмотрите сколько будет хотя бы СОЗДАВАТЬСЯ, ну например, простейшее дерево отрезков, реализованное с указателями на структурки, и сравните с массивом.
а как я понял, вопрошающий строит дерево для синтаксического анализа и вычисления выражений, а хеш-таблицы, друзья мои, используются для определения ключевых слов языка, и потому к вышеозначенной проблеме не имеют никакого отношения... если уж использовать аналогию с машинами, то я вижу такой диалог:
тс:как поменять колесо? мне кажется надо снять все - чтоб машина была в равновесии, поставить её на кирпичи, потом найти нормальное колесо и потом поставить все обратно
я:нет, возьми запаску, сними одно - не упадёт машина на домкрате - и поставь запаску
вы: нет, не надо так делать, а чтобы поменять масло, надо сделать то-то и то-то, это конечно сложно, но ты должен это знать.
>>Нашел, что посоветовать, наверное, ты решил проблему разработчиков за последние лет 30
вообще-то её уже лет 30 назад решили и активно используют... а изменять размер массива - непонятно, почему сразу не выделить один достаточной длины.
а как я понял, вопрошающий строит дерево для синтаксического анализа и вычисления выражений
Абсолютно верно, теперь я в сомнениях... что мне лучше подойдёт.
Видимо нужно спросить у того кто хоть раз серьезно занимался интерпретатором и узнать что будет лучше работать т.к. тут похоже обе стороны правы)
rudvil, я ж предлагаю - посмотри и проверь) работать будут и способ со структурками, и способ с массивом. но способ со структурками а) жрёт больше памяти и б) медленней работает. И в этом нетрудно убедиться - напиши и так и так - всяко на своей шкуре лучше запоминается..
ну, уважаемые мастера, прошу - посмотрите сколько будет хотя бы СОЗДАВАТЬСЯ, ну например, простейшее дерево отрезков, реализованное с указателями на структурки, и сравните с массивом.
а как я понял, вопрошающий строит дерево для синтаксического анализа и вычисления выражений, а хеш-таблицы, друзья мои, используются для определения ключевых слов языка, и потому к вышеозначенной проблеме не имеют никакого отношения... если уж использовать аналогию с машинами, то я вижу такой диалог:
тс:как поменять колесо? мне кажется надо снять все - чтоб машина была в равновесии, поставить её на кирпичи, потом найти нормальное колесо и потом поставить все обратно
я:нет, возьми запаску, сними одно - не упадёт машина на домкрате - и поставь запаску
вы: нет, не надо так делать, а чтобы поменять масло, надо сделать то-то и то-то, это конечно сложно, но ты должен это знать.
>>Нашел, что посоветовать, наверное, ты решил проблему разработчиков за последние лет 30
вообще-то её уже лет 30 назад решили и активно используют... а изменять размер массива - непонятно, почему сразу не выделить один достаточной длины.
Вспоминается фраза: "Сержант Петренко дал предупредительный выстрел в воздух и не попал". Достаточная длина - это сколько? Не припоминаете проблему порога 640Кб оперативной памяти в ДОС? А проблему 2000-го года? А самую распространенную ошибку/уязвимость программных продуктов - переполнение буффера?
Не бывает "достаточной" длины массива. Разве что, он будет выделяться динамически, а при переполнении будет делать expand.
Далее, вы так и не сказали, что именно будет хранится в "тройках" массива в вашем чудо-решении. Если это будут просто слова, то приведите, пожалуйста хотя бы следующие алгоритмы, которые обычно предоставляются интерфейсом:
1. Обход дерева
2. Минимальный элемент
3. Максимальный элемент
4. Удаление элемента
Если же это будут структуры, то нападки на нерациональность решения традиционными деревьями - это несколько даже некультурно :)
Есть статический метод класса:
LONG WINAPI CMyWindow::WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
switch(Message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(wparam)
{
case IDR_BTN_LOAD_FILE:
//вот тут надо открыть OpenFileDialog
break;
}
break;
default:
return DefWindowProc(hwnd, Message, wparam, lparam);
}
return 0;
}
Но как открыть open file dialog и записать результат в переменную объекта класса?
юзай апишку GetOpenFileNameA из comdlg32.dll
OPENFILENAMEA f;
GetOpenFileNameA(&f);
её дается указатель на структуру OPENFILENAMEA и в ней все параметра заданы. А в результат в этойже структуре сможешь найти имя файла который выбран (lpstrFile) и потом через strcpy скопирвовать себе для дальшейшего использования
ss88,
а) если человек строит дерево для вычисления выражения, то по-любому ему надо для каждого выражения создавать новое дерево. теперь сравните затраты на перезаписывание или удаление своего дерева и (хотел сказать моего) нормального.
б) достаточной длиной для выражения является количество элементов в выражении
в) по поводу досовских килобайт:
в.1) у нас не дос
в.2) +8 байт на каждую структурку - два указателя - это типа нормально?
г)по поводу >>приведите, пожалуйста хотя бы следующие алгоритмы, которые обычно предоставляются интерфейсом
г.1) в случае данной проблемы я мало понимаю, зачем тут они нужны
г.2) пожалуйста - для элемента массива с индексом i - предок i div 2, потомки: 2i и 2i+1 (кстати для такой замечательной функции, как предок, в вашу структуру надо добавить ещё и адрес предка. ещё+4*n байт...)
юзай апишку GetOpenFileNameA из comdlg32.dll
OPENFILENAMEA f;
GetOpenFileNameA(&f);
её дается указатель на структуру OPENFILENAMEA и в ней все параметра заданы. А в результат в этойже структуре сможешь найти имя файла который выбран (lpstrFile) и потом через strcpy скопирвовать себе для дальшейшего использования
Да я знаю как записать.. Но я не знаю как записать из статик-метода в переменную класса...
ss88,
а) если человек строит дерево для вычисления выражения, то по-любому ему надо для каждого выражения создавать новое дерево. теперь сравните затраты на перезаписывание или удаление своего дерева и (хотел сказать моего) нормального.
б) достаточной длиной для выражения является количество элементов в выражении
в) по поводу досовских килобайт:
в.1) у нас не дос
в.2) +8 байт на каждую структурку - два указателя - это типа нормально?
г)по поводу >>приведите, пожалуйста хотя бы следующие алгоритмы, которые обычно предоставляются интерфейсом
г.1) в случае данной проблемы я мало понимаю, зачем тут они нужны
г.2) пожалуйста - для элемента массива с индексом i - предок i div 2, потомки: 2i и 2i+1 (кстати для такой замечательной функции, как предок, в вашу структуру надо добавить ещё и адрес предка. ещё+4*n байт...)
Во-первых, это НЕ МОЯ структура, видать, товарищи Кнут, Сэджвик, МакКоннэл и т.д. всю жизнь заблуждались. Видать, разработчики Java и С делают свои продукты неправильно, потому что юзают подход, основанный на RB-деревьях.
Во-вторых, экономить 4-8 байт памяти, тем более, в таком контексте использования - это глупо, т.к. алгоритм усложняется и теряет гибкость...
Насчет ДОСа я сказал образно, это относилось к "достаточной длине"
Как вариант передавать тогда сам объект этого класса или по какойнить хитрости идентифицировать нужные тебе объект (какая нибудь таблица дискрипторов или чтото подобное).
Если у тебя это класс окно то по дискриптору можеш ориентироваться.
>>Во-вторых, экономить 4-8 байт памяти, тем более, в таком контексте использования - это глупо, т.к. алгоритм усложняется и теряет гибкость...
Насчет ДОСа я сказал образно, это относилось к "достаточной длине"
и получили ответ на свою образность.
>>RB
ну ..... слов не хватает, чтоб сказать, что я думаю (нехорошо) ..... Вы вообще можете адекватно объяснить, при чём тут деревья поиска??? Вы знаете другие слова кроме "RB" и "хеш-таблица"? Вы ещё декартовы деревья забыли упомянуть... - то где действительно структура со структурками (сорри за тавтологию) необходима. А вот что, к примеру, дерево отрезков Кнут на практике реализовывал в виде массива - я в этом ни капли не сомневаюсь. Если где-то и писал через указатели, то уж точно исключительно для наглядности.
И вообще, сложность реализации - это спорный вопрос. ибо они обе тривиальны.
Вобщем, где сели там и слезли :) Глупо двум баранам что-либо доказывать друг другу :)
Люди добрые помогите подкиньте пожалуйста рабочий пример работы winsock'ов по протоколу TCP на C , именно на C а не C++ ... Примеров ваще найти немогу , пробывал переделывать C++ код в C так нечего и не вышло :(
вот тут смотри _http://www.tenouk.com/Winsock/Winsock2example9.html
вот тут смотри _http://www.tenouk.com/Winsock/Winsock2example9.html
у там не разобратся полная каша ...
А можно ли както заюзать хейдеры C в C++ ... А то у меня стока ерроров :(
NigHT_0WL
29.04.2009, 16:37
А можно ли както заюзать хейдеры C в C++ ... А то у меня стока ерроров :(
Можно заюзать, только проверь, есть ли необходимые файлы в установленном комплекте. Они находяться в папке Инклуд в каталоге установки.
Можно заюзать, только проверь, есть ли необходимые файлы в установленном комплекте. Они находяться в папке Инклуд в каталоге установки.
Я имею ввиду про свой написаный хедер с набором моих функций , когда компилю в C все норм , если подключаю в C++ проэкте то появляется куча ошибок в хейдере связаные с синтексом :(
NigHT_0WL
29.04.2009, 17:27
Я имею ввиду про свой написаный хедер с набором моих функций , когда компилю в C все норм , если подключаю в C++ проэкте то появляется куча ошибок в хейдере связаные с синтексом :(
Конечно будут синтаксические ошибки, С - морально устаревший... Мой совет подредактируй синтаксис под С++ и в дальнейшем пиши на нем... Поддержка во многих проектах гарантированна всех хейдерных файлов, написанных тобой. (Я просто не могу говорить о чем-то, без определенных примеров кода и ошибок к нему выдаваемых при компиляции)
2Fl0dER, возьми и почитай какую нибудь книжку по С\С++ и большинство вопросов отпадет
ща пытаюсь перевсти C код в C++ ... Какая есть альтернатива uint8_t в C++ ?
-m0rgan-
29.04.2009, 18:05
РЕ адепты!
Есть ли в С++ ф-я на подобие UrlDownloadToFile в ассемблере?
Если да, то приведите пожалуйста пример её использования...
И какая ф-я запускает файл с указаной диры?
Спасибо!
Есть ли в С++ ф-я на подобие UrlDownloadToFile в ассемблере?
в стандартной библиотеке нет такой ф-ции, она предоставляется апи ос или сторонними библиотеками, для винды смотрим тут _http://msdn.microsoft.com/en-us/library/ms775123(VS.85).aspx
з.ы. по всему винапи обращайся к мсдн"у
И какая ф-я запускает файл с указаной диры?
exec*
ща пытаюсь перевсти C код в C++ ... Какая есть альтернатива uint8_t в C++ ?
это typedef над unsiged char, все они обьявлены в sys/types.h
Как определить размер файла спроецированного в озу??
Проецирую:
HANDLE hFile = CreateFile("БИНАРНЫЙ ФАЙЛ.bin" ,GENERIC_READ| GENERIC_WRITE,FILE_SHARE_READ| FILE_SHARE_WRITE,0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFileMapping = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, "NameBinFileMap");
PBYTE pbFile = (PBYTE) MapViewOfFile(hFileMapping, FILE_MAP_COPY, 0, 0, 0);
Получаю:
HANDLE hFileMappingBin = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, "NameBinFileMap");
PBYTE lpFileMapBin =(PBYTE) MapViewOfFile(hFileMappingBin, FILE_MAP_COPY, 0, 0, 0);
ТУТ КАК ТО РАЗМЕР ФАЙЛА НУЖЕН)))
2.ATK
Ф-ця MapViewOfFile в 5ом аргументе принимает количество байтов для маппинга,
LPVOID MapViewOfFile
(
HANDLE hFileMappingObject, // file-mapping object to map into address space
DWORD dwDesiredAccess, // access mode
DWORD dwFileOffsetHigh, // high-order 32 bits of file offset
DWORD dwFileOffsetLow, // low-order 32 bits of file offset
DWORD dwNumberOfBytesToMap // number of bytes to map
);
а ты передаешь 0 следовательно данные из файла в память не мапятся, надо ф-цией GetFileSize получать размер файла и передавать в MapViewOfFile чтоб отобразить файл в памяти.
Вот тут хороший пример _http://comsci.liu.edu/~murali/win32/SharedMemory.htm посмотри.
З.Ы читай внимательно мсдн
2.ATK
а ты передаешь 0 следовательно данные из файла в память не мапятся, надо ф-цией GetFileSize получать размер файла и передавать в MapViewOfFile чтоб отобразить файл в памяти.
З.Ы читай внимательно мсдн
Данные отлично в память мапяться)) при передаче налла в последнем параметре.. файл проецируется полностью, т.е. система сама определяет размер памяти в озу...
АКТУАЛЬНО!!
2 razb
З.Ы читай внимательно мсдн
Ты тоже читай внимательно комменты в MSDN ))
dwNumberOfBytesToMap
Specifies the number of bytes of the file to map. If dwNumberOfBytesToMap is zero, the entire file is mapped.
Говорит о том, что если параметр = 0 то маппится весь файл
2 razb
Ты тоже читай внимательно комменты в MSDN ))
Говорит о том, что если параметр = 0 то маппится весь файл
Да уже заметил... Вообще спешил дк только прототип глянун и сделал соответствующие выводы))
-m0rgan-
30.04.2009, 23:39
Привет!
Как средствами С++ удалить определённый файл?
Накатал такую фигню:
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include < windows.h >
using namespace std;
int main()
{
DeleteFile("C:\\1.txt");
return 0;
}
Получаю ошибку компиляции:
del.cpp
c:\documents and settings\-bug1z-\мои документы\visual studio 2008\projects\del\del\del.cpp(8) : error C2664: DeleteFileW: невозможно преобразовать параметр 1 из 'const char [9]' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Журнал построения был сохранен в "file://c:\Documents and Settings\-bug1z-\Мои документы\Visual Studio 2008\Projects\del\del\Debug\BuildLog.htm"
del - ошибок 1, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Что это значит?
-m0rgan-
30.04.2009, 23:47
.ATK, спасибо!
И пару вопросов на засыпку:
1)как скрыть консольное окно, чтоб при запуске проги оно не появлялось..
2)Дайте линку на ДОСТУПНУЮ статью по работе с файламиэ
3)Как сделать автозапуск файла?
Спасибо!
1)как скрыть консольное окно, чтоб при запуске проги оно не появлялось
поменяй в PE-заголовке subsystem с Console на гуй
2)Дайте линку на ДОСТУПНУЮ статью по работе с файламиэ
CreateFile
CloseHandle...
для начала хватит
3)Как сделать автозапуск файла?
ну неужели не надоело вопрос задавать? варианты - прописаться в реестр в Run, в автозагрузку или сервисом заделаться с втозапуском.
-m0rgan-
01.05.2009, 00:17
Ты не так понял пр автозапуск, я имел в виду запуст левой программы средствами С++
ShellExecute или system("путь до файла")
CreateProcess...
да, кстати.. про файлы и запуск - не смотрите на меня - не обязательно кодить под винду и на апишках
если у нас C, то юзаем fopen или freopen(..., stdin/stdout) и т.п., если cpp, то ofstream, ifstream и прочие стрим.
для выполнения программ - system.
более-менее кросс-платформенно получается
Misha-_-rus
01.05.2009, 08:29
Даны сведения о сотрудниках учреждения: фамилия, инициалы, номер телефона. Выдать на экран сведения о сотрудниках, номер телефона которых содержит одинаковые цифры и подсчитать их количество.
Код рограммы:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct sotr
{char fam [15];
char inic [5];
int nom[6];};
struct sotr N[15];
int main ()
{int i,j,n;
printf("Vvedite kol-vo sotrudnikov - ");
scanf("%d",&n);
for (i=0; i<n; i++)
{printf("familia "); scanf("%s", &N[i].fam);
printf("inic "); scanf("%s", &N[i].inic);
printf("nomer "); for (j=0; j<6; j++){scanf("%d", &N[i].nom[j]);} }
printf("\nSotr: ");
?//Здесь нужно вывести на экран сотрудников номера которых содржат одинаковые цифры и их количество.
printf("%s ", N[i].fam);}
printf("\nKol-vo: ");
getch();
return 0;}
-m0rgan-
01.05.2009, 11:33
В экспрес выпуске Visual C++ не поддерживается редактирование ревурсов.
Как это исправить?
мб патч какой есть?
Спасибо!
Как это исправить?
мб патч какой есть?
Спасибо!
ставь сборку тим систем и будет тебе счастье)
-m0rgan-
01.05.2009, 13:36
У меня нету возможности качать большие файлы =(
Есть ещё варианты?
Есть ещё варианты?
есть Resource Builder, ResED
Заказть полный диск Visual Studio Pro
draliokero
02.05.2009, 03:27
Нужно из определенной папки запустить все файлы с указанным расширением.
WinAPI начал изучать на днях, я так понимаю делается так: из нужной мне директории все файлы с нужными мне расширениями поместить в массив, а потом в цикле скормить в WinExec?
WinAPI начал изучать на днях, я так понимаю делается так: из нужной мне директории все файлы с нужными мне расширениями поместить в массив, а потом в цикле скормить в WinExec?
ага))
Нужно из определенной папки запустить все файлы с указанным расширением.
WinAPI начал изучать на днях, я так понимаю делается так: из нужной мне директории все файлы с нужными мне расширениями поместить в массив, а потом в цикле скормить в WinExec?
хм. Зачем массив, когда вы просто юзаете функцию FindFirstFile(NextFile), проверяете что файл не является директорией, потом расширение и запускаете (сразу в цикле поиска файлов, без каких-то дополнительных массивов). Нашли что надо - запустили, нашли - запустили, к чему массивы? )
как-то так.. )
#include <windows.h>
#include <stdio.h>
#include <string>
using namespace std;
#define MAX_PATH 512
// если найдено ".." или "." - пропускаем
bool is_dots(const char* dir){
if (strcmp(dir, ".")==0) return true;
if (strcmp(dir, "..")==0) return true;
return false;
}
// рекурс. скан. директории
void scan_directory(const char* dir, const char* mask){
char filemask[MAX_PATH];
char temp[MAX_PATH];
sprintf(filemask, "%s\\%s", dir, mask); // полный путь в filemask
WIN32_FIND_DATA wf;
HANDLE hf = FindFirstFile(filemask, &wf); // ищем первый
if (hf != INVALID_HANDLE_VALUE){
do{
if (!is_dots(wf.cFileName)){ // если найдено не ".." или "."
if (wf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){ // если найдено папку
char buf[MAX_PATH];
sprintf(buf, "%s\\%s", dir, wf.cFileName);
scan_directory(buf, mask); // вызываем сами себя
}
else {
if (strcmp(wf.cFileName, ".exe")>=0) { // если в имени ".ехе"
sprintf("%s\\%s", temp, dir, wf.cFileName);
WinExec(temp,SW_SHOW); // запускаем файл
}
}
}
}while (FindNextFile(hf, &wf)); // ищем след.
FindClose(hf); // конец поиска
}
}
int main(int argc, char** argv){
WIN32_FIND_DATA wf;
scan_directory("С:", "*.exe");
return 0;
}
в книге "С++ за 21 день" после выделения и удаления динамической памяти
int *num = new int;
delete num;
рекомендуется обязательно приравнять указатель к нулю
*num = 0;
я использую связку Eclipse + плагин С++ + minGW.
И там даже без последней строчки указатель всегда становится равен нулю.
Как вы считаете, рекомендация ставить 0 - архаизм или же нельзя это игнорировать, только потому что мой компилятор делает это за меня.
>>рекомендуется обязательно приравнять указатель к нулю
а зачем - там не написано?
написано, что если обращаться к указателю у которого память уже высвобождена delete-ом, но не присвоен нуль - будут самые неявные ошибки, вплоть до зависания.
а мой компилятор сам приравнивает к нулю.
хочу понять - щас все компиляторы уже это делают, или тока мой имеет такую фичу.
я не уверен но вроде по стандарту после вызова delete/delete[] указатель становится равным NULL, во всяком случае надо глянуть стандарт, а на компилятор полагатся не стоит.
в стандарте не указано. поэтому лучше прравнивать, а еще лучше исользовать умные указатели. это спасет от утечек памяти.
пытаюсь скомпилить код, пишет ошибку " Не удается открыть файл include: math: No such file or directory" в чем может быть проблема ? (microsoft visual C++ 2008 express)
#include <iostream>
#include <math>
#include <stdio>
#include <conio>
#include <stdlib>
#include <string>
using namespace std;
unsigned long dec=0;
int oct[10],bin[10],hex[10];
int len=0;
int count=0;
char *vosm_strchar*)malloc(sizeof(char));
vvod()
{
scanf("%s",vosm_str);
for(int i=0;vosm_str[i];i+
{
oct[i]=vosm_str[i]-0x30;
if((vosm_str[i]<'0')||(vosm_str[i]>'7'))
return 1;
}
len=i;
return 0;
}
void todec()
{
for(int i=0;i<len;i+
dec+oct[i]*(pow(8,len-i-1)));
}
void tobin()
{
for(int i=0;i<len;i+
switch(oct[i])
{
case 0: bin[i]=0;break;
case 1: bin[i]=1;break;
case 2: bin[i]=10;break;
case 3: bin[i]=11;break;
case 4: bin[i]=100;break;
case 5: bin[i]=101;break;
case 6: bin[i]=110;break;
case 7: bin[i]=111;break;
}
}
void tohex()
{
int i=0;
double temp = dec;
while(temp>=16)
{
hex[i]=16*(modf(temp/16, &temp));
i++;
count++;
switch(int(hex[i]))
{
case 10: hex[i]=0xA;break;
case 11: hex[i]=0xB;break;
case 12: hex[i]=0xC;break;
case 13: hex[i]=0xD;break;
case 14: hex[i]=0xE;break;
case 15: hex[i]=0xF;break;
}
}
hex[i]=temp;
}
void vuvod()
{
printf("\nChislo v 8-ou s.s. = %s",vosm_str);
printf("\nChislo v 10-ou s.s. = %ld",dec);
printf("\nChislo v 2-ou s.s. = ");
for(int i=0;i<len;i+
printf("%.3d",bin[i]);
printf("\nChislo v 16-ou s.s. = ");
for(i=count;i>=0;i--)
printf("%X",int(hex[i]));
}
void main()
{
clrscr();
if(vvod()==0)
{
todec();
tobin();
tohex();
vuvod();
}
else
puts("Chislo zapizano ne v 8-ou s.s.");
getch();
}
в отсутствии файла math ))
попробуй написать math.h
или возьми его из другой версии типа VC++ 6.0
МЫ 2008 сильно урезан во многих модулях. хотя этот должен быть
в отсутствии файла math ))
попробуй написать math.h
В с++ в названиях всех сишных хэдэров должен быть префикс "c",
example:
#include <cstdio>
#include <cstring>
или возьми его из другой версии типа VC++ 6.0
МЫ 2008 сильно урезан во многих модулях. хотя этот должен быть
не имеют права это хэдэр со стандартной либы) каким бы не был экспресс билд, стандарт он должен поддерживать полностью.
В с++ в названиях всех сишных хэдэров должен быть префикс "c",
example:
#include <cstdio>
#include <cstring>
не имеют права это хэдэр со стандартной либы) каким бы не был экспресс билд, стандарт он должен поддерживать полностью.
Не удается открыть файл include: conio: No such file or directory :( уже как только не писал,и #include <conio>, и #include <cconio>, бесполезно :(
Не удается открыть файл include: conio: No such file or directory уже как только не писал,и #include <conio>, и #include <cconio>, бесполезно
файл conio.h это чисто борландовский хэдэр который не входит ни в какие стандарты, по этому его надо обьявлять в си-стиле #include <conio.h>
а мой компилятор сам приравнивает к нулю.
лучше приравнивай.а ещё лучше - сразу следи, чтобы не обратиться к нему после делита. но всё равно обнули)
лучше приравнивай.а ещё лучше - сразу следи, чтобы не обратиться к нему после делита. но всё равно обнули)
отследить легко в хеллоуворлде. а в даже чуть более крупной ЛАБЕ, не то что в коммерческом проекте, можно банально проморгать удаление вектора. потом получается магическая ошибка, когда вызывается метод, но почему то данные неправильные. а все потому, что объект класса имеет указатель this, который убивается делитом, но не приравнивается нулю, и поэтому его можно разыменовать и получить данные. кароч кто видел такие моменты тот меня поймет, када в окне дебаг this = 0x00fea34d. это ацкие ошибки, которые могут вынести мозг и убить на дебаггинг лютые часы. поэтому обнулять обязательно. но еще лучше не юзать чистые указатели для хранения динамических объектов. смарт поинтеры решают.
короч вот простой пример проблем, порождаемых ленивой работой с указателями
class A{
public:
A(){};
A(int _x1, int _x2, int _x3){
x1 = _x1;
x2 = _x2;
x3 = _x3;
};
~A(){};
void f1 (){
y = x1 + x2 - x3;
}
protected:
int x1, x2, x3;
int y;
};
class B{
public:
B(int _x1, int _x2, int _x3){
a = new A(_x1, _x2, _x3);
};
~B(){
delete a;
}
void f1(){
a->f1();
}
protected:
A* a;
};
int main(void)
{
B* b;
b = new B(45, 5, 15);
delete b;
b->f1();
system("pause");
return 0;
}
дебажить заходя внутрь методоа f1 сначала в классе B потом в A. В A имеем следующую картинку
+ this 0xfeeefeee {x1=??? x2=??? x3=??? ...} A * const
причина проста - не обнулен указатель b после делита.
программа будет крашица, но причиной ошибки является не это место. на поиск реального места уйдет драгоценное время. это кстати опять же зависит от компилера и системы. чем заполняется освободившееся место. тут ошибка только благодаря тому что там нет страницы. попробуйте руками изменить адрес this на число например 0x00401000 =) вообще никакой ошибки. это повлечет еще более веселый дебаггинг. и это тот самый тип ошибок, который зависит от сосотяния адресного простарнства процесса. которые не повторяются при выполнении одной и той же послеовательности действий...
delete b;
b = 0;
b->f1();
исправляете так и легко узнаете о попытке обратиться к несуществующему объекту.
Дайте рабочего кода (winapi) с мониторингом физич. памяти, не важно, что: размер дисков, общий объём физ.памяти и т.д.
draliokero
04.05.2009, 23:40
Помогите, пожалуйста, как в QT сделать кнопку и прогресс бар, что бы при нажатие на кнопку импортировались значения в реестр и показывало на прогресс баре состояние импорта.
Хлопцы а хто может с JAVA помочь ? Дайте асю.
Помогите, пожалуйста, как в QT сделать кнопку и прогресс бар, что бы при нажатие на кнопку импортировались значения в реестр и показывало на прогресс баре состояние импорта.
я так понимаю импорт будет идти в цикле? если так то после каждой итерации изменяй значение на прогрессбаре, а вообще в документации все хорошо расписано как работать с виджетами.
я так понимаю импорт будет идти в цикле? если так то после каждой итерации изменяй значение на прогрессбаре, а вообще в документации все хорошо расписано как работать с виджетами.
только еще нужно расчитать, чтоб ровномерно. Иначе может быть циклов 300, а прогресс бар, при каждом вызове, увеличивает на 1%(ну так в GTKmm если не ошибаюсь), и наоборот, 10 циклов, 10 вызовов и всего 10%.
Хлопцы а хто может с JAVA помочь ? Дайте асю.
Темой ошибся, https://forum.antichat.ru/thread90173.html
draliokero
05.05.2009, 16:27
razb, Glazz можете на примере показать? Цикл и изменение прогресс бара.
razb, Glazz можете на примере показать? Цикл и изменение прогресс бара.
я пока ни разу не использовал прогрессбары, толкьо читал. Вот учебник на сайте gtkmm.org(т.е. на gtkmm как это выглядит) , тут объяснения и пример.
http://gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/sec-progressbar.html
Если нужны все методы класса, то покапайся в доках. Если не на си++ то смотри доки по gtk+
Подскажите пожалуйста консольную простую среду разработки для win приложений. Минимум излишеств - требуется для начального обучения синтаксису и т д
Ну что то вроде g++ в никсах :)
razb, Glazz можете на примере показать? Цикл и изменение прогресс бара.
в офф. документации есть примеры даже с картинками, удосужтесь зайти на doc.trolltech.com и почитать.
Подскажите пожалуйста консольную простую среду разработки для win приложений. Минимум излишеств - требуется для начального обучения синтаксису и т д
Ну что то вроде g++ в никсах
lcc или mingw поставь
вообще сперва следует различать IDE и компилятор, по сабжу можешь юзать vi, есть порт под винду + всякие плагины.
Подскажите пожалуйста консольную простую среду разработки для win приложений. Минимум излишеств - требуется для начального обучения синтаксису и т д
Ну что то вроде g++ в никсах :)
lcc и mingw - это, конечно, хорошо, вот только, если вы знакомы с g++ или gcc, то их и ставьте. Ниже ссылка на комплект gcc,g++ и иже с ними под Винду, там еще есть все необходимое (даже лишнее) + неплохая и легковесная IDE - можно юзать как текстовый редактор :)
скачать (http://www.softtime.ru/cpp_info/dev_cpp.php)
а книга/учебник или что-то поучающие кроме офф. доков, где только методы классов по GDKmm вобще есть?
О! нашел, 15я глава этому посвещена.
Народ а обьясните пожалуйста или дайте ссылку где подробно и понятно описан обход дерева в глубину?
Есть ли у кого нибудь рабочая реализация алгоритма Деккера на самом приметивном примере?Лучше на С++ ну или хотябы на другом языке.
B@ton, мб это?
http://www.software.unn.ac.ru/ccam/files/HTML_Version/part5.html
кто нибудь сам компили gtkmm с gtkmm.org ? gtkmm-dev-win32 всякие , они урезаны и там нету gdkmm. Если кто компили исходники, стукните в асю(33023три907) или ты напишите.
Уже сам нашел!
Извеняюсь за нубский вопрос. Но ведь существуют версии языков C/С++ с компонентами (кнопки, списки, скроллбары и т.п) а бывают без (т.е. консольные).
Как их различать? У них есть какое-то название?
Извеняюсь за нубский вопрос. Но ведь существуют версии языков C/С++ с компонентами (кнопки, списки, скроллбары и т.п) а бывают без (т.е. консольные).
Как их различать? У них есть какое-то название?
дак вроде их просто компилируют по разному и все :\ и это не версии языка разные, а просто библиотеки подключают специальные. WindowsForms/Qt/GTK+ и др.
парни, вы все не так поняли, си++ - это с формами, а си - это консольный! ставишь ++ extension и си становится с формочками!!111 я гарантирую
не путать молодежь такими сложными шутками, а то и вправду поверят. с++ - это язык. по дефолту у него есть классы для работы с потоками ввода вывода, файлами, процессами. но не с окнами.
окна - это уже функционал, берущийся из операционки. юзается либо через API, либо через фреймворки аля Qt и иже с ними.
есть задача:
Записать стори в конец файла.(В файл hosts) у меня вот такой код в visual C++ 2008 не робит ,скажите какие надо билиотеки и что ввобще надо дописать.
int main()
{
ofstream out("%windir$\WINDOWS\system32\drivers\etc\hosts", ios::app);
out << "строки " << endl;
out.close();
return 0;
}
помогите довести код до рабочего состояния
#include <iostream>
#include <fstream>
#include <iosfwd>
int main(int argc, char* argv[])
{
std::ofstream of;
char* strings [] = {"aaa", "fff", "rrterqwer", "dasdasd", "asddsa"};
of.open("%windir$\\WINDOWS\\system32\\drivers\\etc\\hosts", std::ios::app);
for(int i = 0; i < sizeof(strings) / sizeof(strings[0]); i++){
of << strings[i] << '\n';
}
of.close();
return 0;
}
копилирется без ошибок но переменная %windir% не работает ,если укозать полный путь то все ок а если %windir% то не добавит!
#include <stdafx.h>
#include <iostream>
#include <fstream>
#include <iosfwd>
int main(int argc, char* argv[])
{
std::ofstream of;
char* strings [] = {"aaa", "fff", "rrterqwer", "dasdasd", "asddsa"};
of.open("%windir%\\WINDOWS\\system32\\drivers\\etc\\hosts", std::ios::app);
for(int i = 0; i < sizeof(strings) / sizeof(strings[0]); i++){
of << strings[i] << '\n';
}
of.close();
return 0;
}
спользуй апи GetWindowsDirectory
char windows_dir [MAX_PATH + 1];
GetWindowsDirectory(windows_dir, MAX_PATH);
[added]
кароч так. string заюзал ибо впадлу гоношица с ручным управлением памятью под строку пути до хостс.
#include <iostream>
#include <fstream>
#include <iosfwd>
#include <string>
#include <Windows.h>
int main(int argc, char* argv[])
{
using namespace std;
std::ofstream of;
char* strings [] = {"aaa", "fff", "rrterqwer", "dasdasd", "asddsa"};
char windows_dir [MAX_PATH + 1];
GetWindowsDirectory(windows_dir, MAX_PATH);
string hosts_path = string(windows_dir) + string("\\system32\\drivers\\etc\\hosts");
of.open(hosts_path.c_str(), std::ios::app);
for(int i = 0; i < sizeof(strings) / sizeof(strings[0]); i++){
of << strings[i] << '\n';
}
of.close();
return 0;
}
пишут ошибку компиляций
error C2664: GetWindowsDirectoryW: невозможно преобразовать параметр 1 из 'char [261]' в 'LPWSTR'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
пля. в 2008 студее по дефолту все строки - юникод. ну напиши GetWindowsDirectoryA, если он не будет настаивать на юникоде то должен скомпилить.
draliokero
09.05.2009, 01:34
1.
Помогите, может есть у кого функция: склонение русских слов после порядковых числительных.
2.
Eсть папка в ней много cfg файлов, нужно записать в массив значения name= из всех файлов
Ребят значит такая ситуация.
Кто подскажет где я туплю...
Visual Studio 2008, язык C++
FILE -> NEW -> PROJECT -> MFC APPLICATION ->
имя и т.д. -> Application type =dialog based -> Use MFC in a shared DLL ->
FINISH - после этого имеем готовый проект диалогового окна. (сгенерирован самой студией)
DEBUG - все нормально
RELEASE - все нормально
идем в
PROJECT -> PROPERTIES -> Configuration Properties -> C\C++ -> CODE Generation ->
-> Runtime library меняем с Multi-threaded DLL (/MD) на Multi-threaded (/MT)
сохраняем и при RELEASE имеем....
Error 1 fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxver_.h 81
че за фигня ? хочу сделать чтоб мой ехе-шник запускался на всех ПК а тут такая лажа(
большое спс за совет.
-------------------------------------------
изменение
Use MFC in a Shared DLL
на
Use MFC in a Static Library
влечет за собой 2 ошибки:
Error 1 error LNK2001: unresolved external symbol __imp__PlaySoundW@12 uafxcw.lib
Error 2 fatal error LNK1120: 1 unresolved externals D:\.....\Release\errerw.exe
имя и т.д. -> Application type =dialog based -> Use MFC in a shared DLL ->
ты указываешь в самом начале использовать длл. а потом меняешь настройки компилятора на статик компоновку. попробуй пересоздай проект, но не ставь галку про шейред длл.
Проблема решена.
Добавил в
Project - Property - Configuratuin Properties - Linker - Input - Additional Dependencies ---- добавил winmm.lib
что есть чуть странным но рабочим вариантом так как на эту мысль натолкнула ошибка с ПЛЕЙСАУНД функцией. (когда писал курсовую я ее использовал и нужо было аттачить winmm.lib) а тут ничего подобого, все функции которые есть в проге не юзают эту либу.
но рабочий вариант)
Всем спс.
Спасибо 2 groupby.
Использую Dev-Cpp, GTKmm.
Делаю приложение с ипользованием gtkmm.
Смотрю какие библиотеки кушает приложение и скидываю в корень с программой. При запуске стиль оформления серый :\.
хочу скомпилить проект с -static . Добавляю этот параметр в компоновщик и надеюсь, что не будет требовать библиотеки. Размер файла такой же и библиы все равно требует :{
компилятор не умеет из dll делать статическую компоновку. для этого ему нужны lib'ы насколько помню.
компилятор не умеет из dll делать статическую компоновку. для этого ему нужны lib'ы насколько помню.
ну .lib имеется для каждого файла, только как все это юзать хз :\
Как использовать сигналы для Gtk::DrawingArea ? верней как привязать сигнал это него? в доках не могй найти.
да юзал бы Qt. доков по нему навалом, книг тоже хватает. Как раз читаю книгу Бланшет, одна из разрабов этого фреймворка, ппц там мощная объектная модель. Описано как сами авторы планировали использование.
Походу я к вам прислушаюсь...
да юзал бы Qt. доков по нему навалом, книг тоже хватает. Как раз читаю книгу Бланшет, одна из разрабов этого фреймворка, ппц там мощная объектная модель. Описано как сами авторы планировали использование.
Стукни пожалуйста в icq#330-23три-907
Тимофеймур
10.05.2009, 19:05
Мне надо матрицу сделать 3*4 и найти наибольший элемент матрицы
если си то вот
#include <iostream.h>
int main()
{
int matrix[3][4];
randomize();
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
matrix[i][j] = rand() % 100;
int max = 0;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
if(matrix[i][j] > max) max = matrix[i][j];
cout<<max;
}
если си то вот... это не си
int max_val = 0;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
max_val= max(max_val, matrix[i][j]);
так красивше
Тимофеймур
10.05.2009, 23:49
Извините за мою умноватость, но где нужно писать этот код ?Я работаю в C++Builder 6
File->А теперь куда нажимать. Подскажите пожалуйста....
имеется Cairo::RefPtr<Cairo::Context> ed = window->create_cairo_context();
на ed рисовал что-то, как мне все очистить? не закрашивать же в ручную?
Sibogatov
11.05.2009, 12:45
как сделать матрицу с числами? в Visual studio 2008
2Sibogatov
примерно так:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
for (int i=1; i<9999999999999999999; i++)
cout<<i;
cout<<"\n";
}
Sibogatov
11.05.2009, 13:19
это писать в Win32 Console Apllication??? написал, нажимаю F7, ошибка
файл-создать-проект-консольное приложение Win32 (Win32 Console Apllication)-ОК
Выбирай НЕ пустой проект.
Если хочешь с пустого, то удали лишние инклуды.
Sibogatov
11.05.2009, 14:27
я как создал тупо все коды стрет какие были и вставил этот
2Sibogatov
примерно так:
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
for (int i=1; i<9999999999999999999; i++)
cout<<i;
cout<<"\n";
}
Причем здесь этот длинный цикл если человек попросил матрицу?, и зачем эти#include "stdafx.h"
#include <fstream>библиотеки если они не используются??? и где "return 0" в функции "main" ?
хрень какуюто написал...
Sibogatov
11.05.2009, 14:44
напиши тогда норм код
2rudvil
а чем те цыкл не матрица??
Цыферки бегут?
бегут!
и зачем эти...
Яже сказал, проект создан не как пустой =///
Чё непонятного??
Еслион создал пустой проект, то пусть уберёт лишнее.
Sibogatov
11.05.2009, 15:02
Если вот у меня задание....
7.В диалоговом окне нарисовать часы (секундная, минутная и часовая стрелки). Цвет циферблата и стрелок выбираем из палитры с помощью объекта класса CColorDialog. Реальное время считывать с помощью класса CTime
Этот какой проект создавать, тоже Вин32 консольный?
ппц. потянулись студенты-лоботрясы. вам сюда (http://forum.antichat.ru/thread42678.html)
Если вот у меня задание....
7.В диалоговом окне нарисовать часы (секундная, минутная и часовая стрелки). Цвет циферблата и стрелок выбираем из палитры с помощью объекта класса CColorDialog. Реальное время считывать с помощью класса CTime
Этот какой проект создавать, тоже Вин32 консольный?
Нет, не консольный, а оконный, так как тебе надо чтобы в диалоговом окне(MESSAGEBOX).
имеется Cairo::RefPtr<Cairo::Context> ed = window->create_cairo_context();
на ed рисовал что-то, как мне все очистить? не закрашивать же в ручную?
это подфорум по с++, не по фреймворкам\тулкитам =)
Нет, не консольный, а оконный,
вообще ему нада делать MFC проект. но проблема в том, что это будет только начало. потом начнутся вопросы как рисовать стрелки, потом как их поворачивать через синус\косинус, итп итп итп.
Sibogatov
11.05.2009, 15:19
это просто Win32 Project?
Вот что у меня имеется... Скачать файл laba.zip (http://dump.ru/file/2587778)
Нужно из этого или незнаю посторить часы... помогите очень прошу
Sibogatov
11.05.2009, 16:53
Первую программу пытался делать тут http://forum.vingrad.ru/forum/topic-205782/anchor-entry1632746/0.html
все сделал по ней, выдает ошибку
1>Compiling manifest to resources...
1>Project : error PRJ0003 : Error spawning 'rc.exe'.
1>Build log was saved at "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\))\))\Debug\BuildLog.htm"
1>)) - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Что это может быть?
Как делать статическую линковку в dev-cpp?
Понимаю что до безумия тупой вопрос но все же. Как сделать из цифры 6 и буквы А, шестнадцатеричное число 6А?
6 и А имеют тип char
Как делать статическую линковку в dev-cpp?
-static
Понимаю что до безумия тупой вопрос но все же. Как сделать из цифры 6 и буквы А, шестнадцатеричное число 6А?
6 и А имеют тип char
Посмотри тут (http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8))
Посмотри тут (http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8))
А смысл? Я и так имею чары. У меня есть массив к примеру из двух элементов
char c1[2];
c1[0] = '6';
c1[1] = 'A';
надо что то сделать чтобы было
int i = 6A
Первый раз ошибся, исправляюсь:
#include <iostream>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[2] = "A";
char b[2] = "6";
strcat(a,b);
int x = strtol(a, NULL, 16);
std::cout << x << std::endl;
return 0;
}
Сам проверил, все работает.
Первый раз ошибся, исправляюсь:
#include <iostream>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[2] = "A";
char b[2] = "6";
strcat(a,b);
int x = strtol(a, NULL, 16);
std::cout << x << std::endl;
return 0;
}
Сам проверил, все работает.
char a[2] = "A";
char b[2] = "6";
strcat(a,b);
за это по рукам, ибо убиваешь стек. нужно сделать переменную третью char c [3] = {0}; и strcat'ить ее два раза сначала с a потом с b.
-static
Я добавляю это в параметры компоновщика, но не канает.
Я добавляю это в параметры компоновщика, но не канает.
extern "C"
так попробуй
Можно как то к TransmitFile прикрутить прогресс бар?
ну как вариант отправлять данные блоками например по 10 кб. лучше вообще многопоточность припахать, юзая параметр OVELAPPED. И работать сразу с несколькими блоками за раз. Это спасет от потери скорости в момент конца пересылки одного блока и отправки второго.
Помогите решить такую задачку на Си:
Написать подпрограмму сортировки 2-мерного массива целых по столбцам (использовать сумму значений столбца), сохранив эти значения во вспомогательной диагонали массива.
Пробовал сначало сделать подсчёт суммы элементов каждой строки, потом сделать сортировку строк на основании их сумм, но выходила какая-то чушь.
Ещё пробовал задать строки в одномерный массив, тоже не смог сделать.
Вообщем вот что у меня вышло, буду рад помощи =)
#include <stdio.h>
#define M 3
#define N 3
#define MAX 100 // наше ограничение
void main(void)
{
int array[M][N]; // Объявление двумерного массива
int i, j;
int a;
int mas1[M], mas2[M], mas3[M];
// Ввод массива
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
// Ввод значения элемента массива
printf(" A[%d][%d]=", i, j);
scanf("%d",&array[i][j]);
}
}
printf("\n");
getch();
//---------------------------------Вывод массива
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
printf("%4d", array[i][j]);
}
printf("\n");
}
printf("\n");
// ---------- Обработка и вывод
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
//----- Присваивание элементов строки в одномерный массив
mas1[i]=array[0][i];
mas2[i]=array[1][i];
mas3[i]=array[2][i];
printf("%4d", mas1[i]);
}
printf("\n");
}
// ------- Вывод суммы элементов каждой строки массива
printf("Summa elemenov strok massiva:\n");
for(i=0;i<M;i++)
printf("%4d", array[i][0]);
getch();
}
Mosvit
дай пример входной матрицы и результата. ибо описание задачи ппц у тебя хромает.
Mozy
try/catch
ps: поцивильнее отформаченый код, ибо с твоим делать что либо банально бесперспективно
#include "StdAfx.h"
#include <stdio.h>
#include <conio.h>
#define M 3
#define N 3
#define MAX 100 // наше ограничение
void enter_matrix( int array[M][N] );
void print_matrix( int array[M][N] );
void process_matrix( int array[M][N] );
void main(void)
{
int array[M][N] = {{1,2,3},{4,5,6},{7,8,9}}; // Объявление двумерного массива
enter_matrix(array);
print_matrix(array);
process_matrix(array);
printf("Summa elemenov strok massiva:\n");
for(int i=0;i<M;i++)
printf("%4d", array[i][0]);
_getch();
}
void enter_matrix( int array[M][N] )
{
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
printf(" A[%d][%d]=", i, j);
scanf("%d",&array[i][j]);
}
}
printf("\n");
_getch();
}
void print_matrix( int array[M][N] )
{
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
printf("%4d", array[i][j]);
}
printf("\n");
}
printf("\n");
}
void process_matrix( int array[M][N] )
{
int mas1[M], mas2[M], mas3[M];
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
mas1[i]=array[0][i];
mas2[i]=array[1][i];
mas3[i]=array[2][i];
printf("%4d", mas1[i]);
}
printf("\n");
}
}
float n;
cin >> n;
Как сделать,что бы когда пользователь вводил буквы вылезало "сообщение" о том,что ыв этом поле вводится только цифра ?
#include <iostream>
using namespace std;
int main() {
float n;
// Enable exceptions in cin.
cin.exceptions(ios::badbit | ios::failbit);
try {
cin >> n;
cout << "The value is: " << n << endl;
} catch(const ios::failure& ex) {
cout << "WTF?! Exception caught! " << ex.what() << endl;
// Clear the fail state
cin.clear();
}
}
Mosvit
дай пример входной матрицы и результата. ибо описание задачи ппц у тебя хромает.
Ну например
Входная матрица:
4 5 6
1 2 3
7 8 9
Результат:
Сортировка по сумме строк:
7 8 9
4 5 6
1 2 3
Запись значений суммы каждой строки в главную диагональ:
15 5 6
1 6 3
7 8 24
P.S за код спасибо :)
терь понятно. ща чай допью и сделаю, если никто не потревожит
зы: требование четкое не юзать c++ или это просто так сложилось что лаба на си написана? лень писать самому сортировку, хотел из <algorithm> заюзать, в связке с std::vector. или не канает?
короч если алго думаю понятный. если нада на чистом си - переделаешь. чтобы вводить матрицу с клавы снимешь коммент с //enter_matrix(array);
#include "StdAfx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <iostream>
#define M 3
#define N 3
#define MAX 100 // наше ограничение
struct row_info{
row_info(int _index, int _summ){
index = _index;
summ = _summ;
};
int index;
int summ;
};
typedef std::vector<row_info*> ROW_INFO_VECTOR;
bool greater ( row_info* elem1, row_info* elem2 )
{
return elem1->summ > elem2->summ;
}
void enter_matrix( int array[M][N] );
void print_matrix( const int array[M][N] );
void process_matrix( int array[M][N] );
void analyze_matrix(const int array[M][N], ROW_INFO_VECTOR& row_infos);
void print_vector (const ROW_INFO_VECTOR& row_infos);
void sort_matrix (const int src_matrix[M][N], int dst_matrix[M][N], const ROW_INFO_VECTOR& row_infos);
void fix_diagonal (int array[M][N], const ROW_INFO_VECTOR& row_infos);
void clear_row_infos (ROW_INFO_VECTOR& row_infos);
void main(void)
{
int array[M][N] = {{4,5,6},{1,2,3},{7,8,9}}; // Объявление двумерного массива
//enter_matrix(array);
print_matrix(array);
process_matrix(array);
_getch();
}
void enter_matrix( int array[M][N] )
{
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
printf(" A[%d][%d]=", i, j);
scanf("%d",&array[i][j]);
}
}
printf("\n");
_getch();
}
void print_matrix( const int array[M][N] )
{
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
printf("%4d", array[i][j]);
}
printf("\n");
}
printf("\n");
}
void process_matrix( int array[M][N] )
{
ROW_INFO_VECTOR row_infos;
analyze_matrix(array, row_infos);
print_vector(row_infos);
std::sort(row_infos.begin(), row_infos.end(), greater);
print_vector(row_infos);
int sorted_array[M][N];
sort_matrix(array, sorted_array, row_infos);
print_matrix(sorted_array);
fix_diagonal(array, row_infos);
print_matrix(array);
clear_row_infos(row_infos);
}
void analyze_matrix( const int array[M][N], ROW_INFO_VECTOR& row_infos )
{
for(int i=0;i<M;i++){
row_infos.push_back(new row_info(i, 0));
for(int j=0;j<N;j++){
row_infos[i]->summ += array[i][j];
}
}
}
void sort_matrix (const int src_matrix[M][N], int dst_matrix[M][N], const ROW_INFO_VECTOR& row_infos)
{
for(unsigned int row_index = 0; row_index < row_infos.size(); row_index++){
int cur_row = row_infos[row_index]->index;
for(int column = 0; column < N; column++){
dst_matrix[row_index][column] = src_matrix[cur_row][column];
}
}
}
void fix_diagonal (int array[M][N], const ROW_INFO_VECTOR& row_infos)
{
for(unsigned int row_index = 0; row_index < row_infos.size(); row_index++){
int index = row_infos[row_index]->index;
int summ = row_infos[row_index]->summ;
array[index][index] = summ;
}
}
void print_vector (const ROW_INFO_VECTOR& row_infos)
{
for(unsigned int i = 0; i < row_infos.size(); i++){
std::cout << "index - " << row_infos[i]->index << " summ - " << row_infos[i]->summ << std::endl;
}
std::cout << std::endl;
}
void clear_row_infos (ROW_INFO_VECTOR& row_infos)
{
for(unsigned int i = 0; i < row_infos.size(); i++){
row_info* cur = row_infos[i];
delete cur;
}
row_infos.clear();
}
терь понятно. ща чай допью и сделаю, если никто не потревожит
зы: требование четкое не юзать c++ или это просто так сложилось что лаба на си написана? лень писать самому сортировку, хотел из <algorithm> заюзать, в связке с std::vector. или не канает?
Спасибо конечно, но вообще да, использовать только язык Си. Поэтому не знаю, смогу ли я это всё перевести с языка С++ на C , т.к. очень поверхносто знаю эти языки... Может если будет время, то попробуешь перевести? Да и большинство слов в этом коде для меня как китайская граммота, что-то не припомню чтобы мы в универе что-то подобное делали...
ну вся суть алгоритма - структура, которая содержит индекс строки и сумму его элементов. сортируешь массив структур. потом проходишь по массиву и строишь новую матрицу по одной строке, беря ее из исходной.
В общем у меня новая проблема) Вроде все математически правильно, только вот компилятор неправильно считает. Я уже незнаю в чем может ошибка заключаться. Если я беру числа 16ные до FF то все нормально работает и преобразуется, но если попадается FF то я получаю странный результат, может кто нить помочь разобраться?
#include <stdio.h>
unsigned int i,k,r,p,t;
unsigned char ch1,ch2;
char array[] = {'0','1','2','3','4','5','6','7','8','9','A','B',' C','D','E','F'};
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
int main (void)
{
ch1='6'; // starshii
ch2='A'; // mladshii
i=k=0;
while(k<17)
{
if(ch1==array[k])
{
r=k;
printf("k %d ",k);
}
k++;
}
while(i<17)
{
if(ch2==array[i])
{
t=(r*16^1+i)-1;
printf("i %d ",i);
printf("Hex %X Decimal %d",t,t);
}
i++;
}
return 1;
}
покритикуйте вот этот кусок, пожалуйста:
char *qs = new char; // выделили место под новую строку (4 байта? надо ли указывать размер?)
strcpy(qs, "string1"); // внесли туда строку
char *m = new char; // строка 2
strcpy(m, "string2"); // строка 2
char *mp[10]; // создали массив указателей на строки (хотелось бы неограниченный)
int n = 0, i = 0;
mp[n++] = qs2; // внесли указатель на первую строку
mp[n++] = m; // внесли указатель на вторую строку
while(n--)
cout << mp[i++] << endl; // вывели строки (немного извращённо)
Основные вопросы:
0 правильно ли я вношу строку в память?
1 как определить массив указателей на строки без указания размера?
2 правильно ли я добавляю элемент в массив? (вроде нет)
3 как получить кол-во элементов образовавшегося массива? (перебрать его весь, инкрементируя на попадающихся концах строк?)
0) нет
char *qs = new char;
ты выделяешь память только под один char, правильно надо указывать размеры массива char[quantity];
1) char** pList; а дальше выделяешь память для массива указателей
как получить кол-во элементов образовавшегося массива?
где то записывать.
З.Ы. код вроде корректен, но не дай боже в нем кому то разбиратся)) все можно было написать гораздо проще)
как получить кол-во элементов образовавшегося массива? C или C++?
Если C+, то юзать вектор.
2 правильно ли я добавляю элемент в массив? (вроде нет) some_vector.push_bask(element)
1 как определить массив указателей на строки без указания размера?
char** strings;
но вообще лучше не использовать char* по возможности. благо есть std::string или CString в atl, который аналогичен mfc'шному CString, но работает в проектах без мфц. массивы же менять на вектора. а указатели, как я уже упоминал, заменять на boost::shared_ptr. хорошо помогает от утечек памяти.
Вообщем сделал я свою программу , только осталась одна загвостка,
она правильно сортирует строки только тогда когда строго сумма первой строки массива<2-ой строки<суммы 3-ей строки
А если наприер сумма второй строки самая большая, то уже считает с ошибкой.
Сделал по-принципу: присвоил temp1,temp2,temp3 сумму каждой строки, потом сделал проврку с циклом,
типа если temp1<temp2, то поменять строки местами.
Вот код:
Сортировать должен сверху самая большая сумма, ниже меньше
#include <stdio.h>
#define M 3
#define N 3
#define MAX 100 // наше ограничение
void main(void)
{
int mas[M][N]; // Объявление двумерного массива
int temp[M];
int i,j,temp1,temp2,temp3;
// Ввод массива
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
// Ввод значения элемента массива
printf(" A[%d][%d]=", i, j);
scanf("%d",&mas[i][j]);
}
}
printf("\n");
getch();
//---------------------------------Вывод массива
printf("Ishodniy massiv:");
printf("\n");
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
printf("%4d", mas[i][j]);
}
printf("\n");
}
printf("\n");
// ---------- Обработка и вывод
printf("Otsortirovaniy massiv:\n");
for(i=0; i<=M-2; i++)
{
temp1=0; temp2=0;
for(j=0; j<=N; j++)
{
temp1=temp1+mas[i][j];
temp2=temp2+mas[i+1][j];
temp3=temp3+mas[i+2][j];
if (temp2<temp3)
{
for(j=0; j<=N-1; j++)
{
temp[i]=mas[i+1][j];
mas[i+1][j]=mas[i+2][j];
mas[i+2][j]=temp[i];
}
}
if (temp2<temp1)
{
for(j=0; j<=N-1; j++)
{
temp[i]=mas[i+1][j];
mas[i+1][j]=mas[i][j];
mas[i][j]=temp[i];
}
}
if (temp1<temp2)
{
for(j=0; j<=N-1; j++)
{
temp[i]=mas[i][j];
mas[i][j]=mas[i+1][j];
mas[i+1][j]=temp[i];
}
}
if (temp2<temp3)
{
for(j=0; j<=N-1; j++)
{
temp[i]=mas[i+1][j];
mas[i+1][j]=mas[i+2][j];
mas[i+2][j]=temp[i];
}
}
for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
{
printf("%4d",mas[i][j]);
}
printf("\n");
getch();
}
}
}
/*for (i=0;i<M;i++)
{
for (j=0;j<N;j++)
{
printf("%4d",mas[i][j]);
}
printf("\n");
getch();
}*/
/*// ------- Вывод суммы элементов каждой строки массива
printf("Summa elemenov strok massiva:\n");
for(i=0;i<M;i++)
printf("%4d", mas[i][0]);
getch();*/
}
Помогите пожалуйста сделать лабу на Turbo pascal
Условие:
"В заданном пользователем масиве целых чисел найти среднее арифметическое максимального и минимального элементов. Отсортировать полученый масив по условию возростания модуля отклонения его элементов от найденого среднего арифметического. Вывести входящий, конечный масивы и найденое среднее арифметическое."
Заранее спасибо!
Mosvit - эпично накалякал =))))))) попробуй погуглить на тему сортировка пузырьком.
зы: и учись разделять блоки кода на функции. именно для этого они и придуманы. а комменты вида
//---------------------------------Вывод массива
очень хорошо говорят нам о том, что этот блок кода должен быть функцией.
typedef char * pChar;
int main()
{
// 1 enter string
pChar buffer = new char(50);
strcpy(buffer, "123456");
// 2 set end pointer
pChar endPointer = buffer;
while(*endPointer++);
*endPointer--;
*endPointer--;
// 3 get length
unsigned int len = strlen(buffer);
// 4 cout string
while(len--)
cout << *endPointer--;
return 1;
}
вкратце.
программа выделяет память под строку, вносит туда строку, создаёт ещё один указатель, перематывает его в конец строки, определяет длину строки и в цикле выводит строку в обратном порядке.
но если убрать эти два декремента:
*endPointer--;
*endPointer--;
программа выводит два квадратика, а потом 6543..
что тут не так?
функции реверса строк не предлагать, я хочу научиться писать их сам
А так нельзя разве?
char *buffer = new char(50);
strcpy(buffer, "123456");
int len = strlen(buffer);
while(len--)cout<<buffer[len];
потому что даже после сравнения с нулем будет инкремент указателя. точнее в момент сравнения с нулем. как бы это объяснить по человечески... минусы использования декрементов и инкрементов в местах не очень для них подходящих... не юзай кароч таких конструкций, и будет все нормально.
#include <iostream>
using namespace std;
typedef char * pChar;
int main()
{
// 1 enter string
pChar buffer = new char(50);
strcpy(buffer, "123456");
// 2 set end pointer
pChar endPointer = buffer + strlen(buffer) - 1;
// 4 cout string
while(endPointer >= buffer)
cout << *endPointer--;
return 1;
}
pChar endPointer = buffer + strlen(buffer) - 1;
то что нужно! спасибо обоим
дайте лит-ру по ГУИ интерфейсу. или подскажите как реализовать:
1)считывание цифр из тексбокса
2) выполнение операций над ними (нарпимер сложение)
3)вывод результата
P.S.
Нужно реализовать вот это
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
char buffer[500];
printf("Enter a number: ");
scanf("%o", &i);
itoa(i,buffer,10);
printf("decimal: %s\n", buffer);
itoa(i,buffer,16);
printf("hexadecimal: %s\n", buffer);
itoa(i, buffer, 2);
printf("binary: %s\n", buffer);
return 0;
}
на гуи :(
дайте лит-ру по ГУИ интерфейсу.
В c++ нет встроенного гуя,тебе нужно взять какую-нибудь сторонню библеотеку: mfc,winforms,qt..
P.S.
Нужно реализовать вот это
Если под винду подойдет winforms.Создавай в студии проект Windows Form Applications,кинь на форму кнопку и текст бокс.В обработчике нажатия на кнопку пиши что нужно сделать.Текст из текст бокса находится в this->textBox1->Text.
p.s. еще вариант на винапи написать.
В c++ нет встроенного гуя,тебе нужно взять какую-нибудь сторонню библеотеку: mfc,winforms,qt..
Если под винду подойдет winforms.Создавай в студии проект Windows Form Applications,кинь на форму кнопку и текст бокс.В обработчике нажатия на кнопку пиши что нужно сделать.Текст из текст бокса находится в this->textBox1->Text.
p.s. еще вариант на винапи написать.
в проге выводятся три значения, я кинул на форму тексбокс, кнопку и 3 лейбла
вопрос номер рас: куда вписывать код, создавать есче один файл СРР ?
2) как прасвоить выводимые данные к лейблам?
3) как считать данные из текстбокса ?
2) как прасвоить выводимые данные к лейблам?
this->label1->Text = "blabla"; Если нужно не текст присвоить юзай метод toString() - this->label1->Text = n.ToString();
3) как считать данные из текстбокса ?
System::String s = this->textBox1->Text;
System::String s = this->textBox1->Text;
error C3149: System::String: нельзя использовать здесь этот тип без "^" верхнего уровня
:(
Если под винду подойдет winforms.Создавай в студии проект Windows Form Applications
не пойдет, ибо winforms это либса не под с++ а под managed c++
по сабжу юзай qt, mfc, wtl, etc.
как прочитать значение из текстбокса, выполнить над ним какуюнить операцию и вывести результат в лейбл, если можно то дайте самы простой исходник
как прочитать значение из текстбокса, выполнить над ним какуюнить операцию и вывести результат в лейбл, если можно то дайте самы простой исходник
Своего или чужого? В какой среде?
Своего или чужого? В какой среде?
короче есть код (консоль) нужно сделать граф. интерфейс. VS 2008. если есть то плиз пример, а есче лучше пример на основе этого кода :)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
char buffer[500];
printf("Enter a number: ");
scanf("%o", &i);
itoa(i,buffer,10);
printf("decimal: %s\n", buffer);
itoa(i,buffer,16);
printf("hexadecimal: %s\n", buffer);
itoa(i, buffer, 2);
printf("binary: %s\n", buffer);
return 0;
}
т.е. для начала нужно заменить вот это:
printf("Enter a number: ");
scanf("%o", &i);
но тут уже нужно взять то что написано в текстбоксе и дальше выполнять действия, вопрос, как это сделать ?
Всем привет!
Недавно начал изучать C++, возник такой вопрос:
#include <iostream>
#include <windows.h>
using namespace std;
int main(){
char *szMess = new char;
szMess = "Hello World!";
cout << szMess;
Sleep(3000);
return 0;
}
Как это возможно? Я так понимаю здесь объявляется указатель szMess на переменную типа char и определяется адресом выделенным под переменную char (new char). Ну это ладно....но как потом он проглотил присваивание указателю строки символов, дык еще и вывел их оператором cout << szMess;
Я наверное чет не так понимаю, но мне кажется должно быть так
char *szMess = new char;
*szMess = "Hello World!";
cout << *szMess;
Но на такую запись он ругается! Объясните новичку че к чему. Заранее спасибо.
Я наверное чет не так понимаю, но мне кажется должно быть так
char *szMess = new char;
*szMess = "Hello World!";
cout << *szMess;
char *szMess = new char; //нормально, делаем указатель
*szMess = "Hello World!"; //тут этот укзаатель начинает указывать на область памяти по адресу "Hell", т.к. указатель - это DWORD=4 байта. Видимо, мы хотим достать демонов из ада
cout << *szMess; //а вот тут-то и ошибка. чтобы достать демона, надо * убрать. Тогда мы призовем всех демонов до первого встретившегося люцифера (нулевого байта)
//Хотя может ты просто хочешь спалить местоположение врат ада
Всем привет!
char *szMess = new char;
szMess = "Hello World!";
cout << szMess;
char *szMess = new char;
*szMess = "Hello World!";
cout << *szMess;
итак. вариант номер один. эквивалентен записи
cout << "Hello World!";
ибо ты выделяешь только 1 байт, что явно не достаточно для строки длиной 13 байт. ты благополучно затираешь выделенный указатель указателем строки хелловорлд, тем самым создавая утечку памяти. по сути ты просто выводишь используя указатель на хуллоуворлд.
вариант два. опять мало байтов. выделен только один. сделав * ты получил доступ к байту, но пытаешься запихнуть туда строку. правильный вариант этой строки *szMess="Hello World!"[0]; Но это опять же не верно, если ты хочешь засунуть туда строку
Правильный вариант
#define HELLO_MSG "Hello World!"
int main()
{
char *szMess;
szMess= new char [strlen(HELLO_MSG) + 1];
strcpy(szMess, HELLO_MSG);
cout << szMess;
return 1;
}
to Kaimi Спасиб....я все понял....просто такой некорректный пример видел в одной статье... после Object Pascal совсем мозг не хочет принимать такие ньюансы работы с памятью.....я уж привык, что string это строка и пиши туда че хочешь и сколько влезет.
to Fatal1ex спасиб за перевод конечно но символ взятия адреса & , а *-разименовывание.
to Ra$kal Очень подробный содержательный ответ спасибо.
И все таки как взять строку из textBox если заранее ее длина неизвестна?
И вообще кто-нибудь может объяснить мне разницу между System::String ^ , string(из инклуда <string.h>) char * и char! Это меня уже 3 день в ступор вводит....
И че это за оператор подозрительный ^; не нравится он мне :)
не пойдет, ибо winforms это либса не под с++ а под managed c++
по сабжу юзай qt, mfc, wtl, etc.
Чем конкретно для его задачи не подходит managed c++?
Чем конкретно для его задачи не подходит managed c++?
Да для его задачи подойдет почти любой язык, но дело не в этом. Я считаю что не стоит сразу привязываться к определенному фреймворку и к бесперспективной надстройке над с++. Лучше будет сначала выучить нативный синтаксис языка + средства сторонних библиотек. Вообще лучше уж сразу писать на C# чем на managed c++.
И все таки как взять строку из textBox если заранее ее длина неизвестна?
В с++ не красиво юзать char* строки, уже лучше воспользоваться STL классом string
И вообще кто-нибудь может объяснить мне разницу между System::String ^ , string(из инклуда <string.h>) char * и char! Это меня уже 3 день в ступор вводит....
И че это за оператор подозрительный ^; не нравится он мне
System::String это класс с .Net'a, а не нативный, как я указал выше используй std string который входит в стандартную библиотеку и являеться кроссплатформенным классом.
Дайте пожалуйста мануал по С++ функциям для файловой системы. Тоесть ls всех файлов/папок, нахождение пути к системным папкам, нахождения пути к запущеному файлу и т д. С меня плюсы. Спасибо
Таак...
Пытаюсь скомпилить с -static , но чото не идет дело.
В pkg-config указываю параметр --static. Т.е. запрос такой:
pkg-config --libs-only-L --static --cflags gtkmm-2.4
В параметры g++ добавил -static.
Добавил -lgtkmm-2.4.dll ( .dll это только название, на самоме деле gtkmm-2.4.dll.a) и др. с библиотеки GTKmm 2.4.
Компиляция вроде все норм завершилась, но .ехе весит пол метра и все равно просит библиотеки ;{
Добавил -lgtkmm-2.4.dll ( .dll это только название, на самоме деле gtkmm-2.4.dll.a) и др. с библиотеки GTKmm 2.4.
Компиляция вроде все норм завершилась, но .ехе весит пол метра и все равно просит библиотеки
Посмотри от каких именно библиотек идут зависимости.
C:\GTK\bin\libgdk-win32-2.0-0.dll
C:\GTK\bin\libpangomm-1.4-1.dll
C:\GTK\bin\zlib1.dll
C:\cygwin\bin\cygwin1.dll - эта пофиг.
C:\GTK\bin\libgtk-win32-2.0-0.dll
C:\GTK\bin\libcairomm-1.0-1.dll
C:\GTK\bin\libatk-1.0-0.dll
C:\GTK\bin\libgobject-2.0-0.dll
C:\GTK\bin\libgdk_pixbuf-2.0-0.dll
C:\GTK\bin\libpango-1.0-0.dll
C:\GTK\bin\libglibmm-2.4-1.dll
C:\GTK\bin\libglib-2.0-0.dll
C:\GTK\bin\libcairo-2.dll
C:\GTK\bin\libpng12-0.dll
C:\GTK\bin\libgdkmm-2.4-1.dll
C:\GTK\bin\libsigc-2.0-0.dll
C:\GTK\bin\libpangowin32-1.0-0.dll
C:\GTK\bin\libgiomm-2.4-1.dll
C:\GTK\bin\libgtkmm-2.4-1.dll
C:\GTK\bin\libpangocairo-1.0-0.dll
C:\GTK\bin\libgio-2.0-0.dll
C:\GTK\bin\libgmodule-2.0-0.dll
C:\GTK\bin\libatkmm-1.6-1.dll
Как я понимаю вы это просили? Ну избавиться я хочу от них, т.е. статически слинковать. Я понимаю, что так все статически слинкуется, вообще все, даже те , что уже есть в системе, но у меня даже так не получается.
[QUOTE]to razb: ты не ответил ни на один мой вопрос....(красота меня ни шибко волновала)
вопрос в силе:
И все таки как взять строку из textBox если заранее ее длина неизвестна?
И вообще кто-нибудь может объяснить мне разницу между System::String ^ , string(из инклуда <string.h>) char * и char! Это меня уже 3 день в ступор вводит....
И че это за оператор подозрительный ^; не нравится он мне
Почитай сначала это (http://samouchka.net/2007/09/06/kak_programmirovat_na_s..html)
Не вижу смысла повторять то, что уже написано, и не раз написано. Про String^ забудь. Это не чистый с++. Помесь с++ и дотнета. Оно тебе все равно рано.
Raskal ты зря думаешь что мне рано и я задаю вопросы потому, что жить скучно. У меня на компе самоучителей по С++ штук 8 валяется....один из них меня заинтересовал "освой С++ за 21 день" и я его читаю.....просто во всех книгах описываются перегруженные функции, операторы, типы данных и классы, как по шаблону....но нигде не написанна разница между массивами данных массивом данных заканчиваюшимся 0 и анси строкой заканчивающейся 0.....Просто после Object Pascal где был тип string такое изобилие строк в с++ мне непонятно......
И если так трудно ответить на такой простой вопрос, может вопрос не такой уж простой?
Я пытаюсь делать так:
private: System::Void bbConn_Click(System::Object^ sender, System::EventArgs^ e) {
String ^szAddr = "172.23.0.74";
SOCKET hSocket;
struct sockaddr_in server;
//Получаем IP servera
szAddr = textBox1->Text;
//Создаем сокет
hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//Заполняем структуру sockaddr_in
server.sin_family = AF_INET;
server.sin_port = htons(1313);
server.sin_addr.S_un.S_addr = inet_addr(szAddr);
iRet = connect(hSocket, server, sizeof(server));
}
А он говорит: error C2664: inet_addr: невозможно преобразовать параметр 1 из 'System::String ^' в 'const char *'
Я и пытаюсь разобратся в изобилии строк С++.....Раздел ведь для новичков....
ну а зачем ты себе жизнь усложняешь, используя мэнэджед с++ ? разберись сначала с чистым с++ без всякого гуя. а ты пытаешься все и сразу освоить. char* - обычный массив символов, заканчивается на 0. но не обязательно. ибо в си как таковых строк не было. в си все массивы по сути байтовые, суй что хочешь. просто задание типа char подсказывает программисту, что это массив символов. но ты легко засунешь туда любые байты, которые не отражают никаких символов. а char* как раз растет из си. на деле этот тип данных используют очень редко. только при вызовах апи. ибо в виндос строки представляют из себя также терминированные нулем массивы байтов. но внутри своей программы ты можешь(и даже должен) использовать более адекватные типы. например класс std::string. по сути это просто оболочка для char*. по сути все классы строк - оболочки для char*. они управляют памятью, предоставляют сервисные методы типа toUpper, или перегруженные методы для сравнения и складывания строк. У всех есть метод получения указателя на строку. для того, чтобы как раз использовать эти классы с системными вызовами. дальше идет класс CString из atl или мфц. он весьма удобный, но не кроссплатформенный. у него метод получения строки GetBuffer(). у класса std::string метод получения указателя c_str(). так же операторы перегружены приведения типов, например LPCSTR. а вот использование мэнэджэд с++ приводит к проблемам, ибо по философии дотнет программисту не дается право управлять памятью напрямую. управление памятью лежит на совести вм дотнета. суть в том что мэнэджэд программы не должны вызывать апи и старые функции. потому что это нарушает философию. для этого в дотнете есть ОГРОМНОЕ количество классов, полностью повторяющих апи. именно поэтому учиться с++ с мэнэджэд плюсов мягко говоря глупо. ты учишь наполовину с++ наполовину дотнет, причем не понимаешь, в чем суть дотнета. хочешь делать окошки - используй мфц проекты с++.
Внушительно.....спасибо...это достойный ответ который многое прояснил..... Держи ++ :)
Не не дает + ставить говорит:
Вы должны добавить репутацию кому-то еще, прежде чем сможете снова добавить ее Ra$cal.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot