Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
#1

Void - C++

05.08.2012, 00:13. Просмотров 849. Ответов 17
Метки нет (Все метки)

Всем привет, форумчане такой к вам вопрос, как передать параметры в такую функцию:
C++
1
2
3
int main(void){
...
}
И можно ли поменять main например на funk1(void), но void должен присутствовать обязательно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2012, 00:13     Void
Посмотрите здесь:

void C++
void C++
delete или new (typeid(void*))(void*) C++
C++ Ошибка void
PAUSE >> void :) C++
C++ Что значит void(*f)()=(void(*)()func?
C++ в чем разница между void f(int &n) и void f(int &&n)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.08.2012, 00:23     Void #2
Цитата Сообщение от Incs Посмотреть сообщение
Всем привет, форумчане такой к вам вопрос, как передать параметры в такую функцию
точно в такую никак. void. передать параметры в функцию main можно из командной оболочки.
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main ( int argc, char** argv ) {
 
    fprintf( stdout, "параметров  = %i  аргумент: %s\n", argc, argv[ 1 ] );
    
    return 0;
}
Bash
1
2
3
pc-host#./test argument
параметров  = 2  аргумент: argument
pc-host#
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
05.08.2012, 00:34  [ТС]     Void #3
Цитата Сообщение от alkagolik Посмотреть сообщение
точно в такую никак.
Да я понял, на вики читал про это, но все таки думал как-то можно. А если такая структура к примеру у программы:
C++
1
2
3
4
5
void funk() {
}
 
int main(void){
}
В таком случае есть ли вариант избавления от этого несчастного void?
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.08.2012, 00:41     Void #4
Цитата Сообщение от Incs Посмотреть сообщение
В таком случае есть ли вариант избавления от этого несчастного void?
ну foo( void ) эквивалентно foo(). а void foo() говорит о том что функция ничего не возвращает. А что подразумевается под "можно ли избавиться" я не понял.
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
05.08.2012, 00:47  [ТС]     Void #5
Цитата Сообщение от alkagolik Посмотреть сообщение
ну foo( void ) эквивалентно foo(). а void foo() говорит о том что функция ничего не возвращает. А что подразумевается под "можно ли избавиться" я не понял.
Если конкретно, то выглядит все это так:
C++
1
2
3
4
5
__global__ void funk() {
}
 
int main(void){
}
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.08.2012, 00:50     Void #6
http://code.google.com/p/stanford-cs...rialHelloWorld
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
05.08.2012, 01:24  [ТС]     Void #7
Цитата Сообщение от alkagolik Посмотреть сообщение
Спасибо вам, они-то молодцы, все так просто и легко если рассматривать их примеры, а как только начинаешь ударяться казалось бы в такие банальные вещи как передача параметров сразу садишься в лужу. Еще и форум отключен у них, ладно пойду дальше гуглить.
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,400
05.08.2012, 01:28     Void #8
Цитата Сообщение от Incs Посмотреть сообщение
Да я понял, на вики читал про это, но все таки думал как-то можно. А если такая структура к примеру у программы:
можно через глобальные переменные
C++
1
2
3
4
5
6
7
8
9
10
11
int i;
void fnk()
{
 i*=i;
}
int main()
{
i=2;
 fnk();
printf("%d",i);
}
А Зачем????
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.08.2012, 01:43     Void #9
Цитата Сообщение от alkagolik Посмотреть сообщение
ну foo( void ) эквивалентно foo()
в С++, но не в Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void foo(void)
{
   printf("%s", "foo\n");
}
 
void bar()
{
   printf("%s", "bar\n");
}
 
int main(void)
{
   bar(1,2,3,100500); //Ok
   foo(1,2,3,100500); //Compilation finished with errors
   return 0;
}
http://liveworkspace.org/code/edfeab...04af301026d652
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
05.08.2012, 02:12  [ТС]     Void #10
Мне вообще нужно сделать так:
C++
1
2
3
4
5
6
7
8
9
__global__ funk_for_gpu(....) {
 
}
 
int myfunk(int a1, int a2, int a3){
...
funk_for_gpu<<<1,1>>>(....);
...
}
Но такой вариант не прокатывает, т.е. если убрать этот злополучный void, компилятор не понимает где код для видяхи я так понимаю, в данной ситуации void работает на подобие указателя что ли... Просто это как бы это один из скриптов для большого проекта, а т.к. проект не вариант переписывать весь под cuda, да и нереально уже пожалуй - нужно найти выход из ситуации... Народ, если есть какие-то мысли, пишите пожалуйста, я попробую скомпилять, хотя наверное я уже все комбинации попробовал короче беда.
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.08.2012, 04:51     Void #11
Jupiter, да, я долго думал уместно ли будет сказать "эквивалентно" и решил что "с пивом пойдет".
Incs, смотри например такой код компилируется без проблем
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
foo( const char* arg ){
    fprintf( stdout, "%s\n", arg );
}
 
main ( int argc, char** argv ) {
 
    foo( argv[ 1 ] );
}
Можешь пояснить чем вызвана необходимость подмены типа?
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
05.08.2012, 10:32  [ТС]     Void #12
Цитата Сообщение от alkagolik Посмотреть сообщение
Можешь пояснить чем вызвана необходимость подмены типа?
Проще говоря, предположим, что есть несколько файлов:
inc.h
C++
1
2
#include calc.cpp
#include res.cpp
calc.cpp
C++
1
2
3
4
int calc(int a, bool b){
...
return calc;
}
res.cpp
C++
1
2
3
4
int res(int v1, int v2){
...
return res;
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
#include inc.h
 
int main(int argc, char* argv[]){
int value1;
int value2;
int par1 = calc(value 1; true);
int par2 = calc(value 2; false);
int result = res(par1, par2);
cout << "res = " << result << endl;
Так вот, на cuda будет файл res.cpp->res.cu, отсюда вопрос как в него что-то передать, если у него структура такая:
C++
1
2
3
4
5
__global__ void funk() {
}
 
int main(void){
}
p.s. код конечно грубовато накидал, но смысл приблизительно такой.
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.08.2012, 14:59     Void #13
Цитата Сообщение от Incs Посмотреть сообщение
вопрос как в него что-то передать, если у него структура такая
кого в кого надо передать? Если надо передать аругменты в функцию
C
1
2
__global__ void foo() {
}
то ее надо переписать так
C
1
2
__global__ void foo( /*args*/ ) {
}
и все вызовы соответственно тоже.
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
07.08.2012, 00:00  [ТС]     Void #14
Цитата Сообщение от alkagolik Посмотреть сообщение
кого в кого надо передать? Если надо передать аругменты в функцию
C
1
2
__global__ void foo() {
}
то ее надо переписать так
C
1
2
__global__ void foo( /*args*/ ) {
}
и все вызовы соответственно тоже.

Если бы все было так просто, я например не могу понять вообще зачем там этот void. Ты немного не понимаешь как все работет, смотри

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//код который выполняется на девайсе(гпу), переменные определяются в main, тут только расчеты.
__global__ void gpu_funk(int a, int b, int *c) {
 
}
 
//тут определяем непосредственно переменные 
int main(void){
int a, b;
int *c_for_gpu;
    
//это так называемое ядро, отсюда передается инфа в gpu_funk(на девайс)
gpu_funk<<<1,1>>>(a, b, c_for_gpu);
...
}
Т.е. мне нужно банально убрать этот void, что бы вместо него поставить туда 2 параметра. Но как только я этот void убираю код не компилится.Передать нужно в main, т.е. все операции с присвоением выделением памяти и т.д. делаются в main.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
07.08.2012, 00:40     Void #15
Цитата Сообщение от Incs Посмотреть сообщение
Если бы все было так просто, я например не могу понять вообще зачем там этот void
Цитата Сообщение от Incs Посмотреть сообщение
Ты немного не понимаешь как все работет, смотри
так кто не понимает - ты, или он?

Цитата Сообщение от Incs Посмотреть сообщение
смотри
и, что это за кусок псевдокода?
откуда это?
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
07.08.2012, 00:44     Void #16
Цитата Сообщение от Incs Посмотреть сообщение
Если бы все было так просто, я например не могу понять вообще зачем там этот void
void это тип. Такой же тип как char, int, и т.д. void foo() говорит о том что функция foo возвращает тип void, если ее описать без типа то она будет приведена к типу int.
Цитата Сообщение от Incs Посмотреть сообщение
Т.е. мне нужно банально убрать этот void, что бы вместо него поставить туда 2 параметра.
вот тут у меня логический ступор. Т.е. тебе надо вместо такого варианта
C
1
2
int main(void) {
}
написать такой
C
1
2
int main(int argc, char** argv) {
}
и компилятор отказывается это делать, то очевидно его (компилятор) стоит поменять.
Цитата Сообщение от Incs Посмотреть сообщение
Ты немного не понимаешь как все работет
я понимаю ровно так как ты описываешь. Ни больше, ни меньше. Скажи уже наконец - то на русском языке в чем проблема?

Добавлено через 1 минуту
alex_x_x, CUDA
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
07.08.2012, 00:54     Void #17
Цитата Сообщение от alkagolik Посмотреть сообщение
alex_x_x, CUDA
есть такое дело
но тут либо проблемы в коммуникации, либо рано до CUDA
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2012, 01:26     Void
Еще ссылки по теме:

Указатель на void C++
не получается передать массив из "void Vvod" в "void CalculatingEstimates" C++
Приведение к void C++
треугольники в с++ с void C++
Typedef void (WINAPI *GLEND)(void), как вызывать? C++

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

Или воспользуйтесь поиском по форуму:
Incs
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 19
07.08.2012, 01:26  [ТС]     Void #18
Так, разобрался, видимо иногда стоит прерываться, а то несколько дней подряд кодинга по 16 часов в сутки дают о себе знать. Вот, что я хотел:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <cuda.h>
#include <iostream>
#include <stdio.h>
 
#ifdef  linux
#include <stdint.h>
typedef int64_t __int64;
#endif
 
using namespace std;
 
__global__ void test(int64_t x, int64_t y, int64_t z, int64_t *res) {
    
    *res = 0;
    z = x ^ y;
    
    while(z)
        {
                ++*res; 
                z &= z - 1;
        }
    
    }
 
void funk(int64_t x, int64_t y){
    int64_t res, z;
    int64_t *dev_res;   
    res = 0;
    z = 0;  
    cudaMalloc((void**)&dev_res, sizeof(int64_t));  
    test<<<1,1>>>(x, y, z, dev_res);    
    cudaMemcpy(&res, dev_res, sizeof(int64_t), cudaMemcpyDeviceToHost); 
    cout<< hex <<"res = "<<res<<endl;   
    cudaFree(dev_res);
}
 
int main(){
int64_t x, y;
cin>>hex>>x; //2BE2E8E3D3CB0;
cin>>hex>>y; //48847E5536130C10;
funk(x, y);
}
Естественно это трешь для примера, считаться будет совсем другое.
P.S. Да и было бы неплохо сделать на форуме раздел CUDA_C.
Yandex
Объявления
07.08.2012, 01:26     Void
Ответ Создать тему
Опции темы

Текущее время: 10:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru