質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

C言語複数のソースのコンパイルに関して

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 737

yoshiki0424yi

score 12

  前提・実現したいこと

あるソースコードにて指定した位置で別のソースコードの操作を走らせたいです.
現在頭を悩ませているコードを記載するのでこの場合はどう記述すればよいのかをご教授願いたいです.
開発環境はLinux OS で vscodeを利用し開発しています.

 発生している問題

別のコードを走らせるためにどう記述すればいいのかがわかりません.

 該当のソースコード

main.cpp

#include <gtkmm/application.h>

#include "MyWindow.h"

int main( ){
    auto app = Gtk::Application::create( );
    ClusteringDataApp::MyWindow myWindow;

    return app->run( myWindow );
}


以下コードの保存処理時に
MyWindow.cpp

#include "MyWindow.h"

namespace ClusteringDataApp{
    void MyWindow::on_saveButton_clicked( ){
        const std::string fileName = "newData.txt";
        std::cerr << data_.size( ) << " data is written to " << fileName << "\n";

        auto ofs = std::ofstream( fileName, std::ios::out );
        if( ofs.good( ) )
            for( const auto& pair : data_ )
                ofs << pair.first << "\t" << pair.second << "\n";
        ofs.close( );

        hide( ); 
    }
}


MyWindow.h

#ifndef MYWINDOW_INCLUDED
#define MYWINDOW_INCLUDED
#include <gtkmm/window.h>
#include <gtkmm/button.h> 
#include <gtkmm/hvbox.h> 
#include <gtkmm/filechooserdialog.h>
#include <gtkmm/stock.h>
#include <gtkmm/filefilter.h>
#include <giomm.h>

#include <iostream>
#include <vector>
#include <utility> // std::pair
#include <fstream>
#include <string>
#include <sstream>

#endif


以下のコードを走らせた後に保存処理が実行されるようにしたい.

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <utility>
#include <algorithm>
#include <random>

#include <Eigen/Dense>

template <typename T = double >
using dataType = std::vector< std::pair<T, T> >;

void showAll( dataType<>& );
void normalize( dataType<>& );

int main(){...
}

void showAll( dataType<>& data ){...
}

void normalize( dataType<>& data ){...
}

 補足情報

譲り受けたコードをいじっていて,別で行いたい処理を記述したコードを作成したので
譲り受けたコードに搭載させることはできないかと考えたためです.
ご教授の方よろしくお願いいたします.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asm

    2018/11/19 17:23

    なぜ、別ソースに分ける必要があるのでしょうか? また、別ソースの方がmain関数である必要がありますか? 最後に、動作環境(OS)は何を想定していますか?

    キャンセル

回答 3

+1

まず

#include <stdio.h>
int main(void)
{
    c *= -1.0;
}

ですが、そもそもcというのが定義されていないのでだめですね。

さて、2つのソースコードを見るとmain関数が双方にあります。つまりプログラムを2つ作ることを意図しているのでしょうか?すると「ここで別ソースコードを実行」というのはプロセスを作って呼び出すとかどういうことに・・・。

とまあ意味不明な事になっているので、ちゃんとやりたいことを整理しましょう。

いきなり別ソースコードを実行を目指すのではなくて、まず関数分けをするところから始めましょう。つまり、

#include <stdio.h>

int main(void)
{
    int a = 1;
    int b = 2;
    int c = 3;

    c += a + b;

    c *= -1;

    printf("%d", c);

    return 0;
}

c *= -1;を別関数に切り分けてみましょう。

しかし変数cはmain関数で定義されている自動変数で他の関数からは直接アクセスすることができません。選択肢は

  1. 変数cをいわゆるグローバル変数(関数スコープに定義されていないstatic storageの変数)にする
  2. ポインタを介してアクセスする

というものがあります。

グローバル変数にするというのは

#include <stdio.h>
static int c = 3;
void f()
{
    c *= -1;
}
int main(void)
{
    int a = 1;
    int b = 2;

    c += a + b;

    f();

    printf("%d", c);

    return 0;
}

こういうことですね。ただこの方法は変数cがどこで書き換えられるのかがわかりにくく、プログラムが大きくなるほどバグを作りやすくなるという欠点があります。

ポインタを介してアクセスするというのは

#include <stdio.h>
void f(int* c)
{
    if(c) *c *= -1;
}
int main(void)
{
    int a = 1;
    int b = 2;
    int c = 3;

    c += a + b;

    f(&c);

    printf("%d", c);

    return 0;
}

こういうことですね。ただこの方法は関数fを呼び出すときにNULLポインタが渡される可能性があるのでNULLチェックが必要になるという欠点があります。

C++を使っていいならlvalue referenceをつかうという手法があります。

#include <stdio.h>
void f(int& c)
{
    c *= -1;
}
int main()
{
    int a = 1;
    int b = 2;
    int c = 3;

    c += a + b;

    f(c);

    printf("%d", c);
}

こうして関数分けをした後に、関数を別の翻訳単位に持っていけばいいでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

求めているのはこういう事でしょうか

// main.c というファイルはここから.
#include <stdio.h>

// 別のファイルにchange_signという関数がある事を宣言しておく.
extern int change_sign(int c);

int main(void) {
  int a = 1;
  int b = 2;
  int c = 3;
  c += a + b;
  c = change_sign(c); // other.c にある change_sign を呼び出す.
  printf("%d", c);
  return 0;
}
// main.c というファイルはここまで.
// other.c というファイルはここから.
#include <stdio.h>

int change_sign(int c) {
  return -c; // c *= -1.0;
}
// other.c というファイルはここまで.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/19 18:21

    ぎゃー…回答書いてる間に質問内容が全然別物に変わってた~(笑)

    キャンセル

  • 2018/11/20 16:43

    回答有り難うございます.
    元の質問内容的にはこちらで聞きたかったことはあっています.
    ありがとうございます.

    キャンセル

0

あまり一般的な技法ではありませんが、#includeを使えばこんなこともできます。

// main.c

#include <stdio.h>

int main(void)
{
    int a = 1;
    int b = 2;
    int c = 3;

    c += a + b;

#include "other.inc"

    printf("%d", c);

    return 0;
}

// other.inc

// 直接埋め込まれるので、関数などに入れずそのまま書く
c *= -1.0;

もう少しシチュエーションなどのコメントを頂ければ、もっといい方法があるかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る