2013-12-12 4 views
0

Я совмещаю две программы на C с использованием файла заголовка.Связывание двух программ C

первой программы

#include<explore.h> 

int main() 
{ 
    int a =10; 
    explore(); 
} 

изучить программу

#include<stdio.h> 

int explore() 
{ 
    // I want to use the value of a. Can I use it? How can sue it? 
} 

Я хочу использовать значение a в explore() в исследовать файл программы.

Могу ли я использовать его? Как его можно использовать, возможно?

+0

Являются ли эти действительно программы или просто два отдельных исходных файлов? – Bathsheba

+2

Передать 'a' как параметр' исследовать'. Это ваша первая программа? – lurker

ответ

1

Хорошо, во-первых. Теперь с кодом, который находится сейчас, вы не сможете использовать int a в любом месте, кроме функции main, так как это локальная переменная для этой функции.
Либо передайте его как аргумент, либо объявите его глобальным (и extern, если на то пошло). В любом случае, я выбрал бы, чтобы передать его в качестве аргумента, если a будет изменено функцией explore, вы можете сделать 1 из 2 вещей:

int explore(int val) 
{ 
    //do stuff 
    return new_val; 
} 
//call: 
a = explore(a);//assigns return int to a 

Или, если Возвращаемый целочисленный сигнализирует о состоянии некоторых kind, передать указатель на a. Это может быть, если вы новичок в указатели, кажется, как верный способ переусердствовать усложнять вещи, но это очень часто, и очень полезно (добавлено примечание о том, почему это полезно внизу):

int explore(int *val) 
{ 
    *val += 123;//add 123 to val's value 
    //this is NOT the same as val += 123, because that's shifting the pointer! 
    return 0; 
} 
//call: 
int return_val = explore(&a);//pass &[address-of]a 

Теперь, связывание двух исходных файлов легко, но вы говорите, что используете заголовочный файл, все хорошо и хорошо, но вы, кажется, не включаете его нигде, и не показываете, как оно выглядит. Я подозреваю, что у вас проблемы с компиляцией кода ... если да, покажите нам, что вы пробовали (как вы компилируете код), и какие ошибки вы получаете.
Если вам нужен простой пример того, как вручную связать 2 исходные файлы: Here's a previous answer of mine that shows, step by step, how to link 2 files

Почему указатели ?:
Много причин, на самом деле.Вот только некоторые из них: использование памяти

  • предела: Если вы передаете большие структур по значению повсюду (то есть, копируя те же данные снова и снова), ваш код будет медленным, и вашим стек может быть загроможден с тем же значением. (переполнение стека, вызванное рекурсией)
  • C может выделять кучную память, к которой можно обращаться только через указатели, вы не можете превратить переменную указателя в не указатель.
  • Возвращаемые значения часто являются способами уведомления об ошибке, которая могла произойти.

Последний вопрос имеет решающее значение. Если вы пройдете a до explore для некоторого сложного вычисления, изменив значение a по пути. Если, наполовину вниз функция, что-то идет грушевидно, как вы уведомляете вызывающего, что значение a более не надежно? Простой:

int complex_function(int *val) 
{ 
    _Bool negative = *val > 0 ? false : true; 
    //do all sorts of magic stuff 
    //val wasn't negative, but is now, possible maxed int? 
    if (negative == false && *val < 0) return -1;//notify using -1 
    return 0;//usually, 0 means everything went well ok 
} 
//call like so: 
if ((complex_function(&a)) != 0) exit(EXIT_FAILURE);//it's all gone wrong 
//else, continue 

Теперь вот где указатели очень полезны. Это не требует, чтобы вы возились со слишком многими временными переменными, создавая копии ценностей повсюду и сравнивая их, чтобы получить тот же вывод.

+0

это всего лишь пример программы. На самом деле мне нужно получить IP-адрес клиента вместо «a». – Beginner

+0

@Beginner: В любом случае, принцип стоит: независимо от того, какая переменная, вы можете либо передать ее по значению, либо как указатель. У обоих есть свои профессионалы и минусы. Передайте переменную функции 'expl', если вы хотите использовать ее значение. если это 'char []', обратите внимание, что он будет деградировать в указатель ('int expl (char * a_as_arg)') –

+0

ok sir thank you. вы можете ответить на этот вопрос [http://stackoverflow.com/questions/20540876/how-to-use-the-clients-ip-address-within-function-included-in-the-server-pro/20544729? noredirect = 1 # comment30754757_20544729]. У меня есть аналогичная проблема, на самом деле это наш мини-проект, но мы не получаем решения. Вы можете нам помочь? – Beginner

0

Звоните explore с помощью a в качестве параметра.

Тем не менее, у вас действительно нет двух «программ». У вас есть два исходных файла в одной программе. Таким образом, другой способ использовать a в обеих частях может состоять в определении a в main.c и объявить его как «extern» в файле research.h. Однако имейте в виду, что a является несколько «глобальным» для вашей программы.

+0

это всего лишь пример. Исследовать() вызывается в моей основной программе, используя файл header.h header. – Beginner

0

просто передать значение (или указатель) от а до вашего изучения функции

прохода по значению (копии)

#include<stdio.h> 
int explore(int value) 
{ 

} 

прохода по ссылке (указатель, указывающий на)

#include<stdio.h> 
int explore(int *value) 
{ 

} 
+0

Я бы не рекомендовал передавать указатель (который технически не проходит по ссылке), если ОП полностью не намерена изменять его значение. – lurker

+0

, конечно, это зависит от того, что мы хотим сделать с A. В контексте языка C «передача по ссылке» означает передачу указателя, см. Http://stackoverflow.com/questions/373419/whats-the-difference-between -passing-by-reference-vs-through-by-value –

+0

@G_G: Я должен был бы не согласиться с вами на этом, ссылка ведет себя скорее как указатель на указатель «постоянно разыменованный» _. Если вы хотите перевести это на C, вам придется использовать такие конструкции, как 'int expl (int ** ref);' (извините за то, что так ничтожно) –

0

Изменить на int explore(int some_var), а затем вы можете использовать some_var внутри этой функции. В main необходимо позвонить как explore(a).

0

Прежде всего, это не две программы. Это единственная программа. Вы пишете функцию. Если вы хотите, чтобы передать значение a этой функции, вы должны передать его в качестве параметра:

#include<explore.h> 
int main() 
{ 
    int a =10; 
    explore(a); 
} 

#include<stdio.h> 
int explore(int a) 
{ 
    // you can now use a here 
} 
+0

его не siongle программа сэр. основные и исследовать разные программы. Я имею доступ к программе изучения в моем основном. но мне нужно значение a, в котором объявлено (в основном) в моей программе изучения. – Beginner

Смежные вопросы