【初心者歓迎】C/C++室 vol.18

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん

エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1115958601/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2005/06/06(月) 00:20:58
余裕の2
3デフォルトの名無しさん:2005/06/06(月) 00:46:47
                l ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
                | >>1が書き忘れたみたいだけど
       ∧_∧   | このスレは環境依存の内容も
  ♪〜  (  ´∀)∠ 激しくOKらしいモナ〜
      j   つ-)  l______________
     ((,,,_ く ヾ
   ;''⌒ヽー'、,_)7'⌒ヽ
   ':;.,___ノ""""ヘ.,___ノ
4デフォルトの名無しさん:2005/06/07(火) 22:01:49
>3
忘れたのはスレタイにだけだろw

4様
5デフォルトの名無しさん:2005/06/08(水) 12:48:47
5ヒロミ
6デフォルトの名無しさん:2005/06/08(水) 14:06:46
ろくなもんじゃねぇ
7デフォルトの名無しさん:2005/06/08(水) 15:20:41
>>1
どこを7め読みすればいいんですか?
8デフォルトの名無しさん:2005/06/08(水) 16:02:01
うっかり8兵衛
9デフォルトの名無しさん:2005/06/08(水) 16:03:27
9速にスレの質が低下してまいりました。
10デフォルトの名無しさん:2005/06/08(水) 16:22:55
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **p;
int i, j, x, y;
scanf("%d %d", &x, &y);
p = (int**) malloc(sizeof(int*) * x);
for (i = 0; i < x; i++) {
p[i] = (int*) malloc(sizeof(int) * x);
}
for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
p[i][j] = NULL;
printf("%d", p[i][j]);
}
printf("\n");
}
for (i = 0; i < x; i++) {
free(p[i]);
}
free(p);
return 0;
}
二次元配列を行>列で(↑ではx=4,y=5など)動的確保すると
開放の時失敗してしまうのは何故ですか?
11デフォルトの名無しさん:2005/06/08(水) 16:29:43
>>10
x と y を使う場所がかなり混乱してるよ。
あと、p[i][j]はintだから、NULLを代入しちゃダメ。
12デフォルトの名無しさん:2005/06/08(水) 16:31:29
>>10

確保する時に両方要素数がxになってるぞ。どっちかはyのつもりなんだろう?

あと、
p[i][j] = NULL;
はintとint*のサイズが同じマシンでは動くことは動くだろうが、
正しくは
p[i][j] = 0;
だな。
13デフォルトの名無しさん:2005/06/08(水) 16:38:09
>>12
NULLを(void *)0としているC処理系ではエラーだろうな。
1410:2005/06/08(水) 16:39:04
>>11-13
アドバイスありがとうございます。
ちょっと試行錯誤してみます。
15デフォルトの名無しさん:2005/06/08(水) 16:55:25
>>13
MicrosoftのCLコンパイラはただのワーニングで通すよ、
エラーではなく。
エラーにするコンパイラ、ある?

__STDC__ではNULLは(void*)0
__cplusplusなら0
と定義してる処理系が多いのではないだろうか。
1610:2005/06/08(水) 18:16:13
NULLの部分は修正しました。で、この辺りに問題があると思い
p = (int**) malloc(sizeof(int*) * x);
for (i = 0; i < x; i++) {
p[i] = (int*) malloc(sizeof(int) * x);
}
x,yの位置の組み合わせ(↑だとxxx)を全パターン試してみましたが

結果
○:一見動いているように見える。
×:Debug Error! DAMAGE: after Normal block〜省略
不:不正な処理。
A:アドレス?がprintfされた。

入力値
1: x=y
2: x>y
3: x<y

___|1|2|3
xxx|○|○|不
xxy|○|×|不
xyy|○|×|×
yyy|○|×|○
yxy|○|×|A
xyx|○|×|×
yxx|○|×|A
yyx|○|×|×
全滅ですた…
17デフォルトの名無しさん:2005/06/08(水) 18:23:08
>>16
p = (int**) malloc(sizeof(int*) * y);
for (i = 0; i < x; i++) {
p[i] = (int*) malloc(sizeof(int) * x);
}

だろ。
18デフォルトの名無しさん:2005/06/08(水) 18:25:29
>>16
まずxとyの意味をはっきりさせろ。
19デフォルトの名無しさん:2005/06/08(水) 18:26:16
>>17
for (i = 0; i < y; i++) {

だろ。
20デフォルトの名無しさん:2005/06/08(水) 18:32:44
>>16
問題はそこだけじゃない。
ぜんぶのforで、iが0からいくつで変化するか、考えてみよう。



21デフォルトの名無しさん:2005/06/08(水) 18:35:43
っていうか p[i][j] に対して p[x][y] を常に入れれば問題はなくなるだろ。
もしくは>>19的な p[i][j] と p[y][x] でもいいし。

とりあえずp[x][y]でいくなら>>16>>17の3行は上からx, x, y。
それと>>10
for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
のとこ逆。
p[y][x]でいくならまた話は変わるけど。
2210:2005/06/08(水) 18:45:05
ありがとうございます。

>>21
x:列(横)
y:行(縦)
p[行][列]のつもりでした。

>>18
x,y→row, colにしました。

>>17-21
引続き試行錯誤してみます。
2310:2005/06/08(水) 19:12:58
できたー!
int main()
{
int **p;
int i, j, row, col;
scanf("%d %d", &row, &col);
p = (int**) malloc(sizeof(int*) * col);
for (i = 0; i < col; i++) {
p[i] = (int*) malloc(sizeof(int) * row);
}

for (i = 0; i < col; i++) {
for (j = 0; j < row; j++) {
p[i][j] = 0;
printf("%d", p[i][j]);
}
printf("\n");
}

for (i = 0; i < col; i++) {
free(p[i]);
}
free(p);
return 0;
}
x,yという名前でさらに混乱してました
アドバイスありがとうございました。
24デフォルトの名無しさん:2005/06/08(水) 19:32:12
>>23
こうすると解放が簡単。
int main(void)
{
  int **p;
  int i, j, row, col;
  scanf("%d %d", &row, &col);
  p = (int **)malloc(sizeof(int*) * col);
  p[0] = (int *)malloc(sizeof (int) * row * col);
  for (i = 1; i < col; i++) {
    p[i] = p[0] + row * i;
  }

  for (i = 0; i < col; i++) {
    for (j = 0; j < row; j++) {
      p[i][j] = 0;
      printf("%d ", p[i][j]);
    }
    printf("\n");
  }

  free(p[0]);
  free(p);
  return 0;
}
2510:2005/06/08(水) 21:14:56
>>24
なるほど、参考にさせていただきます。
26デフォルトの名無しさん:2005/06/09(木) 02:47:27
二次配列を作るための関数を作成して、メイン関数で後々使うことを
目的としているんですが、どうもうまくいきません
コンパイルはできるのですがxの値が2を超えた瞬間に
「*a[i] = new int [y];」の部分がエラーといわれて止まってしまいます
どういうことなんでしょうか?

void make(int ***a , int x , int y)
{ 
 *a = new int* [x];
 for(int i=0; i<x; i++){
  *a[i] = new int [y];
  }
}

void main()
{
 int **a, x , y ;
 cout<< "値入力\n";
 cin >> x >> y;
 make(&a, x , y);
}
27デフォルトの名無しさん:2005/06/09(木) 02:48:58
>>26 (*a)[i]
2826:2005/06/09(木) 02:52:34
2分とたたない、すばやい回答ありがとうございます
無事エラーが無くなりましたm(_ _)m
29デフォルトの名無しさん:2005/06/09(木) 04:41:52
>>24
それはマズイだろ・・・
30デフォルトの名無しさん:2005/06/09(木) 15:25:00
C++で、ファイルから読み込んだバイト数を知りたいのですが、
readはその数を返してくれませんよね。
freadは返してくれるけどstdioをインクルードしないといけないから本来はCの関数ですよね?
C++ではどうやるんでしょうか?
31デフォルトの名無しさん:2005/06/09(木) 15:28:15
>>30
#include <cstdio>と書けばstd::freadがある。
32デフォルトの名無しさん:2005/06/09(木) 15:45:26
>>30
read()は返してくれるだろ
まあread()は標準じゃないけどな
3330:2005/06/09(木) 16:02:12
レスありがとうございました。
上手く出来ました。
34デフォルトの名無しさん:2005/06/09(木) 16:20:10
http://pc8.2ch.net/test/read.cgi/tech/1115958601/566
>でもbasic_istream.readは廃止予定みたいなワーニングがでます。

前スレでこんなんあったんだけど
書式なしで読み込みたい場合、readの代わりに何を使ったらいいんですか?
35デフォルトの名無しさん:2005/06/09(木) 18:33:13
1バイトの変数に255が入っている時、++したら
その変数の8ビット目の次の無関係の領域のビットに繰り上がりますか?
つまり
char a[4];
a[3]++;
というような処理で、aをunsigned intの様に扱えるのだろうかという事です。
36デフォルトの名無しさん:2005/06/09(木) 18:36:41
>>35
扱えません。

どうでもいい話だが
charがsignedで8bitなら、「255」は入らないだろ
unsignedと仮定すると、255の時点でインクリメントすると0になる
37デフォルトの名無しさん:2005/06/09(木) 18:44:40
オーバーフローしないっけ
38デフォルトの名無しさん:2005/06/09(木) 18:46:55
unsigned整数はオーバーフローは絶対にしない
K&Rにそう明記されている
39デフォルトの名無しさん:2005/06/09(木) 18:51:14
サンクス
40デフォルトの名無しさん:2005/06/09(木) 21:18:04
union使え
41デフォルトの名無しさん:2005/06/09(木) 21:50:34
何にだよw
42デフォルトの名無しさん:2005/06/09(木) 23:17:41
夜の生活に決まってるだろ
43デフォルトの名無しさん:2005/06/09(木) 23:20:58
>>40>>35へのレスだとは思うのだが
まあどうでもいい話だな
44デフォルトの名無しさん:2005/06/09(木) 23:25:51
あんなんにunionなんぞ使わんでも元からintにしときゃいいし
45デフォルトの名無しさん:2005/06/10(金) 06:57:39
オレティメットキャスト使え
46デフォルトの名無しさん:2005/06/10(金) 07:04:17
fopen等の読み取り専用モードでファイルを開く時、
メモリ上に既に他のプロセスで読み取り専用で開かれたそのファイルのデータがあったら
HDDにアクセスする事無くそのメモリ上のデータへのポインタを返して欲しいのだけど
そういう機能ってあるんでしょうか?
例えばWEBページの静的ページなどはメモリ上に固定化して置いておけると
HDDアクセス無く出力できるので
もしそういう機能が無いなら何らかの方法でそういう方法を取ろうと思うのですが。
47デフォルトの名無しさん:2005/06/10(金) 07:11:09
前回のアクセスからそう間をおかなければ勝手にOSのディスクキャッシュにひっかかるだろ。
48デフォルトの名無しさん:2005/06/10(金) 07:14:44
>>46
他プロセスの持ってるポインタをクレって時点で普通じゃないと知れ
49デフォルトの名無しさん:2005/06/10(金) 07:28:08
>>48確かにそうですが・・・
例えばOSとかapacheでそのデータをメモリ上に固定して置いて
ページ生成時にそれを使うとか。

>>47
fopenがディスクキャッシュを使っていると思って良いのでしょうか?
こういうライブラリの詳細な内容って何処かで分からないものでしょうか。
50デフォルトの名無しさん:2005/06/10(金) 07:34:33
>>49
「fopenが」ではなく「OSが」そんなディスクキャッシュを持っている。

OSを信じてやろうよ。
51デフォルトの名無しさん:2005/06/10(金) 08:47:31
なんか、根本的にOSが判っていないのに上辺の知識だけ身についてる感じ?
52デフォルトの名無しさん:2005/06/10(金) 09:15:07
UNIX 系なら mmap()+mlock()、Win32 なら CreateFileMapping()+MapViewOfFile()+VirtualLock() で
できそうな気はするけど、他のプロセスにとって迷惑でしかないと思われるので本当にシビアな場合以外は、
素直に OS に任しておくべきだと思う。
53デフォルトの名無しさん:2005/06/10(金) 11:08:18
>もしそういう機能が無いなら何らかの方法でそういう方法を取ろうと思うのですが
どうやって?
54デフォルトの名無しさん:2005/06/10(金) 13:29:28
#include <iostream>
#include <cstring>
using namespace std;
// 受け取った文字列を逆順にする関数
void Reverse (char *str)
{
int i, j; char temp;

for (i = 0, j = strlen(str) - 1; i < j; i++, j--) {
temp = str[i];
str[i] = str[j]; // どうやら、これがエラー
str[j] = temp; // どうやら、これがエラー
}
}
int main ()
{
char *str = "abcdefgh";
Reverse(str);
cout << str << "\n";
return 0;
}

すみません、質問です。
↑のは文字列を逆にする関数ですが、
関数内で文字列を代入するときエラーが出てしまいます。
これはなぜなんでしょうか。
ツールはVisual C++ 6.0を使ってます。
コンパイルは通るけど、実行段階でエラーが出てます。。
55デフォルトの名無しさん:2005/06/10(金) 13:41:19
void Reverse (char *str)
{
int i, j;
char temp, *_str2;

_str2 = &str[strlen(str) - 1]; // 最後の文字のポインタを格納

for (i = 0, j = strlen(str) - 1; i < j; i++, j--) {
temp = *str;
*str = *_str2;
*_str2 = temp;
str++; // 先頭から進める
_str2--; // 後ろから戻す
}
}

どうも↑でもダメなようです。
根本的に考え方が間違ってるんでしょか。
56デフォルトの名無しさん:2005/06/10(金) 13:42:21
>>54
char str[] = "abcdefgh";にすれば動くと思うよ。
""で括った文字列リテラルはconstだから書き換えできない。
char []にするとそこへ文字列のコピーを作るということになって書き換えできる。
5754-55:2005/06/10(金) 13:48:06
>>56
うほっ、できました!
char *str = "abc" は自動的にconstになるんですか・・
そえば、なんかどっかで「基本的に書き換えちゃだめ」とか聞いたかも。
一つ勉強になりました。

どうもありがとー。
58デフォルトの名無しさん:2005/06/10(金) 17:58:37
────── main.cpp ────────
#include <iostream.h>
#include "hoge.h"

void main()
{util();}
────── hoge.h ─────────
extern void util();
────── util.cpp ────────
#include <iostream.h>

void util()
{cout << "run" << endl;}

────── makefile ────────
out.exe:main.obj util.obj
[タブ]bcc32 main.obj util.obj
main.obj:main.cpp hoge.h
[タブ]bcc32 -c main.cpp
util.obj:util.cpp
[タブ]bcc32 -c util.cpp

makeを用い、以上のファイルをコンパイルしたいのですが
Error makefile Command syntax errorと出てコンパイル出来ません
すみませんがどうか正しいmakefileの書き方を教えて下さい
59デフォルトの名無しさん:2005/06/10(金) 18:30:38
60デフォルトの名無しさん:2005/06/10(金) 18:32:31
>>58
俺のとこではエラーでなかったけど、まあ他に気になったのが

out.exe:main.obj util.obj
[タブ]bcc32 -e$@ main.obj util.obj

って風につけくわえないと main.exe って名前になってしまう。
61デフォルトの名無しさん:2005/06/10(金) 18:48:56
reverse_iteratorというものがあって、それを使おうとして、
ヘルプを調べたのですが↓

basic_string::reverse_iterator
typedef reverse_iterator<iterator, value_type,
reference, pointer, difference_type>
reverse_iterator;
この型は、制御シーケンスの逆方向反復子としてオブジェクトを定義します。

読み方がまったくわかりません。
いったいどうやって使えばよいのでしょうか?
これで文字列を逆順で表示できると思ったのですが。
62デフォルトの名無しさん:2005/06/10(金) 19:01:44
>>61

typedef std::string::reverse_iterator riter;
std::string s = "abcdefg";

for ( riter r = s.rbegin(); r != s.rend(); r ++ )
  std::cout << * r;
63デフォルトの名無しさん:2005/06/10(金) 19:01:59
>>61
std::string::reverse_iteratorとstd::reverse_iterator<std::string::iterator>は同じもの。
実際には,rbegin(), rend()を、
std::string str;
std::copy(str.rbegin(), str.rend(), std::ostream_iterator<char>(std::cout));
みたいに使う。
64デフォルトの名無しさん:2005/06/10(金) 19:04:22
>>57
K&R時代のふるーいCプログラムの場合は確信犯的に
文字列リテラルの中身を書き換えたりするものもある。

実際、文字列リテラルをどういったセグメントに配置するかはコンパイラによるし、
オプションで変更できる場合も多い。
readonlyなセグメントに配置された場合は、当然それを
書き換えようとすればsegmentation faultになる。
俺の知る限り、gccはデフォルトでTEXTに配置し、MicrosoftのCLはDATAに配置する。

ま、今のスタイルとして、文字列リテラルを書き換えるのは間違いなく「邪悪」だから、
やらないほうが良いのは確かだな。
65デフォルトの名無しさん:2005/06/10(金) 19:10:09
そもそも書き換えるのなら「リテラル」である意味が無い
66デフォルトの名無しさん:2005/06/10(金) 19:42:30
>>62-63
できました、ありがとうございました。
> std::copy(str.rbegin(), str.rend(), std::ostream_iterator<char>(std::cout));
けれど、これはコピペしてみたのですが
'ostream_iterator' : 'std' のメンバではありません
'ostream_iterator' : 定義されていない識別子です。
と、出て動きませんでした。うーむ・・・

template については少し理解があるつもりなのですが、
reverse_iterator<iterator, value_type,reference, pointer, difference_type>
とある場合、何を入れたらいいのかがわかりません。もう慣れるしかないんですかね
なにはともあれ、レスありがとうございました。申し越し頑張ってみます
67デフォルトの名無しさん:2005/06/10(金) 19:59:50
>>59-60
ありがとうございます、ちょっと敷居が高そうですがもう少し頑張ってみます
68デフォルトの名無しさん:2005/06/10(金) 20:01:08
>>66
#include <iterator>してる?
69デフォルトの名無しさん:2005/06/10(金) 20:05:10
>>66
ostream_iteratorは<iterator>をインクルードすると使える。

> reverse_iterator<iterator, value_type,reference, pointer, difference_type>
こんな型は標準にはない。reverse_iteratorには引数をひとつ渡せば十分。
仮に処理系が余分なパラメタを設定しているとしても、指定しなくても良いように
デフォルト引数があるはず。
70デフォルトの名無しさん:2005/06/10(金) 20:18:07
>>68
成功しました。何度もありがとうございます。
>>69
デフォルト引数! 最近知ったばかりです。そうなのでしたか、
安心しました。m(_ _)m
あと、一応関係ないですが、僕は55の人じゃないので、
質問が似てただけで、偽者とかじゃないです。
気を悪くしてたらすみません >55
71デフォルトの名無しさん:2005/06/10(金) 20:43:14
VC++6.0 Windowsでやってるのですが
半角を全角にしたくて前スレにもあった質問を見てみました。
検索した結果がこれなんですが
http://www.geocities.co.jp/SiliconValley/4805/bcbtips/bcbtips085.htm

vcl.hが無いせいかAnsiString型が使えないのと
エラーを吐き出してしまいます。どのようにすればよいのでしょうか?
72デフォルトの名無しさん:2005/06/10(金) 21:54:07
応用力の無い初心者は手の施しようが無いな。
73デフォルトの名無しさん:2005/06/10(金) 22:36:35
>>71
どの変換も肝はLCMapString。
AnsiStringはstd::stringやCStringにでも置き換えろ。
74デフォルトの名無しさん:2005/06/10(金) 22:43:19
>>71
#include <windows.h>
#include <string>
#include <vector>
std::string han_to_zen(std::string han)
{
std::vector<char> buf(LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han.c_str(), -1, 0, 0));
LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han.c_str(), -1, &buf[0], buf.size());
return std::string(&buf[0]);
}

#include <iostream>
int main()
{
std::cout << han_to_zen("ゴルァ");
return 0;
}
75デフォルトの名無しさん:2005/06/10(金) 23:52:08
OS WindowsXP
CPU セレロンD335 2.8GHz
メモリ 512MB
開発環境 VisualC++6.0

#include <stdio.h>

const int A = 1024;
const int B = 128;

int main()
{
double hairetu[A][B];

return 0;
}

上記のように配列を宣言するだけのプログラムですが。これを実行すると
「問題が発生したため、test.exe を終了します。 ご不便をおかけして申し訳ありません。」
と表示されプログラムが正常に動いてくれません。
配列の要素数がこの半分のときは普通に動くのですが。
メモリが足りないのでしょうか?対処法があれば教えてください。
76デフォルトの名無しさん:2005/06/10(金) 23:56:44
>>75
リンカの設定でスタックサイズを増やせ。デフォルトでは1MBだ。
77デフォルトの名無しさん:2005/06/11(土) 00:46:48
>>74
本当に感謝。有難う。
7875:2005/06/11(土) 01:28:54
>>76
ベリーサンクス。プロジェクト→設定→リンク→アウトプット→スタックアロケーション
で2000000と打ってみたらうまくいきました。これであってますよね?
79デフォルトの名無しさん:2005/06/11(土) 01:56:59
>>78
ま、それで動くけど、俺なら0x200000と入れたいな。好き嫌いの問題だが。
80デフォルトの名無しさん:2005/06/11(土) 08:31:29
#include<iostream>
#include<time.h>
int main(){
char a[100] = "";
time_t *b;
time(b);
strftime(a,99,"%Y/%m/%d %H:%M:%S",localtime(b));
cout << a << endl;
}
このプログラムで目的の時刻表示は出来たのですが、もっとスマートな書き方ってありませんか?
8180:2005/06/11(土) 08:33:30
あ、bがポインタって事は>>80のプログラムはもしかしてメモリリークしてますか?
82デフォルトの名無しさん:2005/06/11(土) 08:41:24
メモリリークはせんがそれ以前にbはどこも指してねーぞそれ。
83デフォルトの名無しさん:2005/06/11(土) 08:43:45
スマートかは知らないけど、時刻とかならlocaltime()を使う
方法もありますよ。

あと、*bはメモリを自分で確保してるわけではないので、
開放は必要ないかと。
8480:2005/06/11(土) 08:45:37
あ!time()側で時刻データが用意されてbに時刻データへのポインタが入力されたり
システムの時刻データ保持領域へのポインタをくれるのかと思ってたんですが
time_t b;
time(&b);
localtime(&b);
とやるのですね。
8580:2005/06/11(土) 08:50:03
すると>>80のプログラムはbの指す位置から
sizeof(time_t)分のメモリが書き換えられてしまって
他のプロセスに影響が出る可能性があるのかな。
連投すみません。
86デフォルトの名無しさん:2005/06/11(土) 08:53:38
>>83
あ、間違えた >>83は、>localtime()を使う方法
ではなく、 >tm構造体を使う方法でした。

雑魚なのに、でしゃばってしまいました m(__)m
87デフォルトの名無しさん:2005/06/11(土) 11:56:46
文字列の改行についての質問です。
ttp://www.plustarnet.com/aspil/Programming/c02.htm
このページを参考に、
画面に出した文字列を任意の場所で改行する"\n"を入力しても、無視されてしまいます。
"あいうえお\n"
"かきくけこ"
と入力したのに、実行すると
「あいうえおかきくけこ」と表示され、改行されないんです。
試しに\nの位置を変えてみて、
"あいう\nえお"
"かきくけこ"
という感じで設定して実行すると、
あいう
えお
と、表示された後、改行された後にある「えお」の部分が消え、最終的には
「あいうかきくけこ」
という風に、"\nえお"の部分がなかったものにされたかのような表示がされます。
改行のさせ方自体が根本的に間違っているのでしょうか?
88デフォルトの名無しさん:2005/06/11(土) 12:00:18
>>87
まずint main(void)にしろ。
話はそれからだ。
89デフォルトの名無しさん:2005/06/11(土) 12:20:07
(・ε・)エエェーいつも main() にしてるよぉ

90デフォルトの名無しさん:2005/06/11(土) 13:25:16
main()とmain(void)は同義だ
void mainのこと言ってんだろ、88は
91デフォルトの名無しさん:2005/06/11(土) 13:26:05
>>87
参考にしたページなぞどうでもいい、それよりもオマエの書いたソースを晒せ
92デフォルトの名無しさん:2005/06/11(土) 13:32:39
main()
{
 printf("もうだめぽイェア\n");
}
93デフォルトの名無しさん:2005/06/11(土) 16:18:02
>>90
main() と同義なのは、
C: main(...)
C++: main(void)
94デフォルトの名無しさん:2005/06/11(土) 16:53:54
>>87
ありゃ、普通に改行されるけど。void mainでも同じ。

#include <stdio.h>

int main(void)
{
printf("あいうえお\n""かきくけこ");
return 0;
}
95デフォルトの名無しさん:2005/06/11(土) 17:20:16
だから>91
自分で気がつかない・分からない凡ミスなんてよくあること
ソース見せなきゃ始まらない
96デフォルトの名無しさん:2005/06/11(土) 17:23:32
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
97デフォルトの名無しさん:2005/06/11(土) 17:59:53
>>96は何が言いたいんだ?
98デフォルトの名無しさん:2005/06/11(土) 18:29:05
なにか、晒してるようだが・・
うーん、謎だ。ここはご本人様の登場を待ちたい。
99デフォルトの名無しさん:2005/06/11(土) 18:35:12
#include <stdio.h>

int main(void)
{
int i;

for(i=0; i<10; i++)
printf("printf(\"あいうえお\\n\"\"かきくけこ\");\n");

return 0;
}
100デフォルトの名無しさん:2005/06/11(土) 18:57:00
100
101デフォルトの名無しさん:2005/06/11(土) 18:57:40
スイカップの古瀬絵理って結局今何してんの?
ぜんぜん見ないみたいだけど、引退?
102デフォルトの名無しさん:2005/06/11(土) 20:32:38
Linuxで複数のユーザがアクセスするプログラムを書きたいのですが、
常駐プログラムとしてではなく普通にプログラムを書いたら、
同時にアクセスされた場合にプログラムが二つ起動してしまうでしょうか?
103102:2005/06/11(土) 20:43:40
連投すみません。
場合によるかもしれないのでもう少し詳細に書きます。
このプログラムは1つのソースファイルに書かれています。
いくつかの関数があって、ユーザの与えた引数によってswitchして呼び出す関数を変える様になっていて、
それで呼び出された関数以外はそのアクセスでは使われません。
これでもし同時アクセス時にプログラムが二つ起動するとなると、
使われない関数が多数メモリにロードされる事になるのでは無いだろうかと心配です。
104デフォルトの名無しさん:2005/06/11(土) 20:53:21
やればわかるじゃない。
まあ聞く場所を間違えたようだな。
105デフォルトの名無しさん:2005/06/11(土) 20:55:17
ごめん、全角半角切り替えが過去に出ていたので便乗質問させていただきますが

char のポインタでの全角半角変換ってどうすればできます?
std::stringからcharのポインタ変換できなくて困ってます。
便利な関数なので使いたいのですが。
106デフォルトの名無しさん:2005/06/11(土) 21:07:00
>>105
もちつけ。
charのポインタに全角半角の変換機能があるなんて初耳だ。
どれが便利な関数でどうなんだ?

とりあえずstd:stringのからC文字列へのポインタが欲しければc_str()
107デフォルトの名無しさん:2005/06/11(土) 21:20:45
>>106
藻前も餅漬
108102:2005/06/11(土) 21:24:30
>>104
自分一人ではデバッグ出来ないので・・・
確かに聞く場所を間違えました。
この質問はスルーしてください。
109デフォルトの名無しさん:2005/06/11(土) 22:12:48
visual c++6.0で書いているのですが、これってCとC++のどちらで
書くかを設定するコマンドってありますか?
何も気にしないでプロジェクトつくると勝手にC++仕様になっていると思うのですが。
CとC++ではクラス以外にも微妙な文法の違いがあるので、
それをいろいろ試してみたいと思いまして。
110デフォルトの名無しさん:2005/06/11(土) 22:42:32
>>109
拡張子変えれ
111デフォルトの名無しさん:2005/06/11(土) 23:30:30
>>109
手元にVC6.0が無いから詳しく説明できないが、
拡張子がcppならc++、cならcがデフォルトで選ばれるようになる。
後から変更したいのならば、ファイルのプロパティでコンパイラを選べたはず。
112109:2005/06/11(土) 23:38:58
>>110
>>111
ありがとぅー。ためになります。
113デフォルトの名無しさん:2005/06/11(土) 23:55:37
2次元配列の勉強をしていてちょっとわからないところがあるのですが
例えば data[][10]={適当な文字列を複数}; と宣言して、
先頭の文字が a で始まるものだけを表示したい場合
for文とif文で表現できると思うのですがこの時for文の継続条件式は
どう書くのでしょうか?
for(i=0;文字列分<i;i++)と書いたら宣言内の文字列が変わった時に条件式も変えていくしかないのでしょうか?

長文ですみません
114デフォルトの名無しさん:2005/06/12(日) 00:03:29
for(i = 0; i < sizeof(data) / sizeof(data[0]); ++i)
115デフォルトの名無しさん:2005/06/12(日) 00:06:00
>>113
forループ内でdataの内容が変わるならそういうことになるな。
その時点で設計を疑った方がいいと思うが。
後はバッファを用意するとか。
116デフォルトの名無しさん:2005/06/12(日) 00:07:19
PGMファイルを読み込んで、画素にアクセスし、何もしないでそのまま出力。
という課題があるんですが、どうしたらいいかよくわかりません。
どなたかアドバイスをお願いします。
visual studio でCを使います。
117デフォルトの名無しさん:2005/06/12(日) 00:09:51
>>116
課題を出した人に質問する。
118デフォルトの名無しさん:2005/06/12(日) 00:16:16
>>114
>>115
まだまだ勉強不足でしたorz
レスありがとうございました
119デフォルトの名無しさん:2005/06/12(日) 01:02:40
>>105
>>74を見て書けばいいじゃん、と思うわけだけれども。勢いで作ってしまった
から、引数はconst std::string& hanにすべきだったなと今になって思うが。
【質問の不明確な点】
[0] OSは?
[1] Windowsだとして、>>74に直接char*を渡してはいけない理由は?
  (渡せばstd::stringのコンストラクタに任せてしまえばいい)
[2] Cで書かなければならないとして、char*を返すとしたらそのメモリの確保と
  解放の方法は?malloc&free?
120デフォルトの名無しさん:2005/06/12(日) 15:00:59
>>119
OSはWindowsです。
何故か直接渡せませんorz
malloc使っております。
121>>74=>>119:2005/06/12(日) 17:25:36
>>120
Cで書くとこんな感じ。参考に。
#include <windows.h>
#include <stddef.h>
#include <stdlib.h>

char* han_to_zen(const char* han) {
    size_t n = LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han, -1, 0, 0);
    char* buf = (char*)malloc(n);
    LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han, -1, buf, n);
    return buf;
}

#include <stdio.h>

int main(void) {
    char* zen = han_to_zen("ゴルァ");
    printf("%s", zen);
    free(zen);
    return 0;
}
122デフォルトの名無しさん:2005/06/12(日) 18:48:11
>>121
親切すぎに有難うございます。
お蔭様でやりたい事が出来ました。
123デフォルトの名無しさん:2005/06/12(日) 19:22:40
親切すぎ?
124デフォルトの名無しさん:2005/06/12(日) 19:46:51
ワロスww
125121:2005/06/12(日) 19:53:19
テラワロスww
126デフォルトの名無しさん:2005/06/12(日) 22:58:44
newとmallocの違いって、コンストラクタを呼び出すかしないかの違いでいいんですよね?
127デフォルトの名無しさん:2005/06/12(日) 22:59:28
>>126
分からんぞ〜
128デフォルトの名無しさん:2005/06/12(日) 23:12:54
>>126
機能面から見ればその通り。
ただし、メモリ確保を同じように実装している保証はない。
したがって、例えばnewで得られたポインタをfreeするのは正しくない。
129デフォルトの名無しさん:2005/06/12(日) 23:15:47
確保するメモリ量を変えていく場合、毎回newでとるよりrealloc使ったほうが
効率いいんですか?
130デフォルトの名無しさん:2005/06/12(日) 23:20:20
標準C/C++の範囲内の話ならstd::vectorみたいにあらかじめ多めに確保しておくのが一番。

プラットフォーム依存ならWindowsのVirtualAllocみたいにアドレスだけ予約。
131デフォルトの名無しさん:2005/06/12(日) 23:24:51
このプログラムってどこが間違ってるんでしょうか?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/545.txt
132デフォルトの名無しさん:2005/06/12(日) 23:32:01
最近の初心者は他人にデバッグさせるんですか?
133デフォルトの名無しさん:2005/06/12(日) 23:37:57
>>128
なるほろどもです。
実装は異なっても*pとかp++とかは同じようにできるんですよね。
なんか不思議。でもないか。。。
134デフォルトの名無しさん:2005/06/13(月) 00:15:54
>>131
> どこが間違ってるんでしょうか?

藻前の頭
135デフォルトの名無しさん:2005/06/13(月) 00:16:08
>>133
それはアドレスを進めてるだけだからそんなに不思議でもないぞ
配列もポインタで操作できるし
136デフォルトの名無しさん:2005/06/13(月) 00:54:51
int* i=new int[ 10];
ってやったとき、この配列が10個って言うのを、
調べる方法は無いんですか?
別の変数で保存しておくしか無いんでしょうか?
137デフォルトの名無しさん:2005/06/13(月) 00:55:56
>>136
Yes.
138デフォルトの名無しさん:2005/06/13(月) 00:56:39
>>135
実装が違うと、同じ演算子でも呼び出すコードは違うんでしょうね。
繰り返し演算するときは、演算時間も変わってくるかもですね。
139デフォルトの名無しさん:2005/06/13(月) 00:57:57
>>137
は、速いレス恐れ入ります。ありがとうございました。
140デフォルトの名無しさん:2005/06/13(月) 01:02:50
deleteで気になって仕方がないんですが、例えば、
char* str=new char[ 256];
とnewしたら
delete [ ] str;
しなさいって本に書いてますよね。
これ、delete str;ってしたら先頭の要素だけ解放されて、
残りの255個の要素はメモリリークするってことなんですか?
逆に、例えば、
int* i=new int;
:
delete [ ] i;
ってやったらまずいんでしょうか。
実行時エラーは起きないんですが。
141デフォルトの名無しさん:2005/06/13(月) 01:05:05
>>140 未定義動作
142デフォルトの名無しさん:2005/06/13(月) 02:51:48
>>136-137
あれ、でも delete する時サイズ指定しなくてもいいってことは、どこかにサイズって記録されてるんじゃないの?
143デフォルトの名無しさん:2005/06/13(月) 03:07:34
>>142
環境依存
144デフォルトの名無しさん:2005/06/13(月) 05:26:13
>>142
そして、保存されていてもアプリ側から取得できるかどうかはわからない
145デフォルトの名無しさん:2005/06/13(月) 15:06:58
>>144
取得できる環境って実際あるわけ?
146デフォルトの名無しさん:2005/06/13(月) 15:44:04
正規な手段は無いが、取ろうとすれば取れる。
147デフォルトの名無しさん:2005/06/13(月) 15:56:27
ウソコケw
148デフォルトの名無しさん:2005/06/13(月) 17:03:46
クソコケw
149デフォルトの名無しさん:2005/06/13(月) 17:05:43
VC++6.0だと先頭アドレスの前にサイズが格納されてるな。
150 ◆bk1IKp1NkI :2005/06/13(月) 18:01:04 BE:171152993-#
あるHPに
printf("\x1b[2J")
と書くと画面が消える、と書いていたのですが、実際には変な記号のようなものが表示されるだけで、消去できません。
どうすれば画面消去できるのでしょうか?
ちなみにXPを使っています。
151デフォルトの名無しさん:2005/06/13(月) 18:04:37
telnetサービスを起動後、適当なtelnetクライアント
(teratermとか、puttyとか、poderosaとか)を使って、
localhostに接続、ログイン後、そのプログラムを動かせ。
152デフォルトの名無しさん:2005/06/13(月) 18:05:07
>>150
開発環境、動作環境などを明確に。
153 ◆bk1IKp1NkI :2005/06/13(月) 18:05:30 BE:38034432-#
BCCを使っています
154デフォルトの名無しさん:2005/06/13(月) 18:11:31
簡単な関数を作って使おうと思っているのですが
satoshiDlg.obj : error LNK2001: 外部シンボル ""protected: int __thiscall CSatoshiDlg::dangerous(int)" (?dangerous@CSatoshiDlg@@IAEHH@Z)" は未解決です
Debug/satoshi.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

satoshi.exe - エラー 2、警告 0
と出てしまいます。何が原因なのでしょうか?
155デフォルトの名無しさん:2005/06/13(月) 18:24:31
>>154
そりゃあCSatoshiDlg::dangerous(int)が定義されてないんだわよ
さとしくん
156デフォルトの名無しさん:2005/06/13(月) 20:16:11
サービスからクライアントに接続する凄技>>151が居るスレはここですか?
157151:2005/06/13(月) 20:31:29
>156
わけわからん。「telnetサービス」はMSが決めた名前だが、
不満でもあるのかい?
158デフォルトの名無しさん:2005/06/13(月) 20:34:04
>>150
「\x1b[2J NT」でぐぐれ
159デフォルトの名無しさん:2005/06/13(月) 20:40:08
ans = sin( 0.5*180.0 );
printf( "ans = %f\n ",ans );
と,書いても1がでないんですが,どうやったら正しい値がでますか?
160デフォルトの名無しさん:2005/06/13(月) 20:43:30
.cpp以外のものはどういう場合で使うのですか?
161デフォルトの名無しさん:2005/06/13(月) 20:43:50
sin(0.5*3.141592654);
162デフォルトの名無しさん:2005/06/13(月) 20:45:21
>>160
具体的にどうぞ。
163デフォルトの名無しさん:2005/06/13(月) 20:49:48
>>161
ぱいって180じゃないんですね
どうもっす
164デフォルトの名無しさん:2005/06/13(月) 20:57:55
ゆとり教育のせいかか・・
165デフォルトの名無しさん:2005/06/13(月) 21:01:27
かなり初歩的な質問なのですが、
char command[10];
scanf("%s”, command);
if(command == "hoehoe"){hoe()}
上のプログラムで入力された文字列を比較したいのですが、うまく出来ません。
文字列の比較をするにはどうやったらよいですか?
166デフォルトの名無しさん:2005/06/13(月) 21:07:24
strcmp
167デフォルトの名無しさん:2005/06/13(月) 21:09:22
c++のwriteは、リファレンスによるとその時のストリームに対して出力するという機能らしいですが
その時のストリームってどうやって指定するんですか?
標準出力に出力したいのですが。
168デフォルトの名無しさん:2005/06/13(月) 21:13:38
>166
ありがとう。
標準関数使えばいいんですね。
上手くできました
169デフォルトの名無しさん:2005/06/13(月) 21:16:11
>>167
C++にwriteなんてものない。
何かのクラスのメンバじゃないか?
170デフォルトの名無しさん:2005/06/13(月) 21:18:51
_write
データをファイルに書き込みます。
int _write( int handle, const void *buffer, unsigned int count );

↑はあるみたいよ
171デフォルトの名無しさん:2005/06/13(月) 21:22:04
>>170
非標準
172デフォルトの名無しさん:2005/06/13(月) 21:34:39
>>169
それは ostream::writeのことを言っているのか?
STLで派生先のテンプレートに隠蔽されている。
派生先のテンプレートクラスを使えばいい。

173172:2005/06/13(月) 21:35:23
>>169>>167
174169:2005/06/13(月) 21:43:04
そんなところにあったのかよ。
○| ̄|_
175デフォルトの名無しさん:2005/06/13(月) 21:46:45
int ax=5;
float bx=1.8;
int cx=ax*bx;

9にならないんでしょうか?(´・ω・`)
176167:2005/06/13(月) 22:04:55
http://www.shibu.jp/cppreference/cppio_details.html#write
これの事です。
出力バイト数を指定する機能が欲しいんです。

>>172
すみません。STLはほとんど知りません・・・
それを継承しているクラスに対してのみインタフェースを出しているからそのクラスを使え
という事でしょうか。
177デフォルトの名無しさん:2005/06/13(月) 22:09:56
>>176
cout.write("hoge", 4);のように使う。
まあ、今みたいにナル文字終端なら<<使えばいいわけだが。
178デフォルトの名無しさん:2005/06/13(月) 22:32:58
>>175
ならない。
int ax=5;
float bx=1.8;
float cx=ax*bx;
int dx=(int)cx;
179デフォルトの名無しさん:2005/06/13(月) 22:38:21
>>175
なるよ
結果の代入先の型のせいでなってないだけ
180デフォルトの名無しさん:2005/06/13(月) 22:42:34
5*1.799999...=8.9999...->切り捨てー>8とか?
181デフォルトの名無しさん:2005/06/13(月) 22:53:23
>>180
intとfloatの内部構造が同じだと思ったら大間違い
182デフォルトの名無しさん:2005/06/13(月) 23:21:17
うちの環境だとfloat>doubleにしたら9になった
183デフォルトの名無しさん:2005/06/14(火) 00:08:21
確かにdoubleにすると9になりますね
精度の関係なのでしょうか('_'?)
実数型とビット構造について少し調べてみます
答えてくださった方、ありがとうございました
184デフォルトの名無しさん:2005/06/14(火) 00:14:31
Cでn次の連立方程式に対して反復法のヤコビ法を行うプログラムつくってるんですけど、
スタックオーバーフローおこしちゃうんですよね。
2次元配列ふたつと一次元配列ひとつmallocでメモリ確保したり、
変数にstaticつけたりしてるんですけどなかなか解決しません。
スタックオーバーフローの回避方法として何かいい方法はないでしょうか?
185デフォルトの名無しさん:2005/06/14(火) 00:18:45
>>184 再帰に気をつける。
186デフォルトの名無しさん:2005/06/14(火) 00:56:04
>>184
コンパイルオプションでスタックを巨大に取っておくとか。
187184:2005/06/14(火) 01:39:17
>>185
再帰使ってないんですよね。よくわからなくて^^;
余裕があれば使ってみようと思います。

>>186
そんな方法があるのは知りませんでした。ちょっと調べてみます。
188デフォルトの名無しさん:2005/06/14(火) 01:55:22
>>187
全部mallocで動的確保してみ。
189デフォルトの名無しさん:2005/06/14(火) 02:12:11
>>187
再帰を使うときは、関数呼び出しだけでもスタック使いまくるから
呼び出し回数が多いとアウツになるかも試練。
呼び出し途中で落ちるなら、引数の数をなるべく減らすとか、
構造体にしてアドレスで渡すとか工夫汁。
190デフォルトの名無しさん:2005/06/14(火) 02:14:18
>>184
単純に配列のサイズ間違えちゃったりしてると、
予測不能の動きになるから、その辺もアヤシイ。
191デフォルトの名無しさん:2005/06/14(火) 02:19:26
>>184
どのタイミングでエラーになるとか調べた?
デバッガ使える?
使えなければデバッグライトとか入れてみて、
どこで落ちるのかとか調べてみ。

ウィンドウズなんかのプログラムだと、
やたらと複雑なダイアログ作りまくりのうえでループ走らせたりすると、
簡単にスタックオーバーフローになったりするが。
192デフォルトの名無しさん:2005/06/14(火) 02:21:07
16ビット環境だったらかなりしんどそうだ。。。
193デフォルトの名無しさん:2005/06/14(火) 12:28:13
>>188
メモリリークしまくりそうで怖ひ。
194デフォルトの名無しさん:2005/06/14(火) 13:22:25
c++のコンパイラでコンパイルできないcのソースというのは在りえますか?
あるとすれば、例えばどういったことをしている場合が考えられるでしょうか。
c++はcの機能を内包してるんじゃないのでしょうか。
195デフォルトの名無しさん:2005/06/14(火) 13:38:52
>>194
まず変数・関数名にC++のキーワードを使っていたら駄目だな。
あとC++はCよりも型に対するチェックが厳しくなっている。例えばvoid *からその他のポインタへの変換はC++ではキャスト(static_cast)が必要。
C99とは互換性がないのでこれもアウト。(inlineとかC++由来の機能は平気だが)

詳しくはX3014の最後の方にCとの互換性のなくなったものが理由付きで一覧になっている。
196デフォルトの名無しさん:2005/06/14(火) 14:43:59
C++なんですが、
std::endlやstd::endsなど
関数なのに括弧なしで呼び出すことが出来るのは
なぜですか?

std::strstream str;
str << "hoge" << std::endl; // ←コレ

同じように引数をとらない関数を括弧なしで呼び出したいんですが・・。
197デフォルトの名無しさん:2005/06/14(火) 14:54:19
>>196
その式で直接呼び出されているのはstd::endlではなくてstd::ostream::operator<<(ostream &(*)(ostream &))。
この関数にstd::endlへのポインタを渡している。
198デフォルトの名無しさん:2005/06/14(火) 15:00:12
>>196
strstreamは古い。stringstreamを使え。
199デフォルトの名無しさん:2005/06/14(火) 15:43:27
>>197-198
わかりました。
ありがとうございました。
200デフォルトの名無しさん:2005/06/14(火) 16:11:40
>>196
std::endlなんかは関数ではなくて関数オブジェクトというモノ

その構文が納得行かなければ「関数オブジェクト」と
「オペレーターオーバーロード」でぐぐってみ
201デフォルトの名無しさん:2005/06/14(火) 16:18:35
>>200
関数だよ。
>>197に書いてある通りostreamは関数へのポインタを受け取る。
関数⊆関数オブジェクトではあるが。
202デフォルトの名無しさん:2005/06/14(火) 16:33:42
()を付けないと関数のポインタが取れるだけで関数は関数だということを知らない人なのだろうか、>>200
203デフォルトの名無しさん:2005/06/14(火) 17:51:53
メモリリークのチェックの仕方を教えてください。
実行環境はlinuxなのですが、
プログラムを何度か実行しながら時折vmstatでメモリ残量を確認してみても
メモリ残量が増えたり減ったりしていて参考になりそうに無いです。
204デフォルトの名無しさん:2005/06/14(火) 18:31:47
>>203
つvalgrind
205デフォルトの名無しさん:2005/06/14(火) 18:47:34
ここって環境依存OKじゃないの?
206デフォルトの名無しさん:2005/06/14(火) 18:50:38
>>205
おk
207デフォルトの名無しさん:2005/06/14(火) 18:53:26
うはwwwっをkwwww
208デフォルトの名無しさん:2005/06/14(火) 22:05:19
構造体を下記のように書きたいんだけど、下記の場合コンストラクタって
どう書けばよいのですか?
typedef struct {
    char a;
    long b;
} STest;
209デフォルトの名無しさん:2005/06/14(火) 22:08:12
>>208
C++なんだから構造体タグ名だとかtypedefだとかいうCの慣習は
不要であって、
たんに

struct STest {
  char a;
  long b;
};

と書けばよい
無論コンストラクタは STest()ね。
210デフォルトの名無しさん:2005/06/14(火) 22:48:55
>>209
やっぱそうですか。そうします。
211デフォルトの名無しさん:2005/06/15(水) 00:39:51
>>210
よけいなお節介だが、C++でのstructとclassの差って分かってるよね?

基本的に

structのメンバのデフォルトがpublic、classはデフォルトがprivate

の差でしかない。
212デフォルトの名無しさん:2005/06/15(水) 00:44:53
>>211 よけいなお節介と知りながら書き込む人は嫌いです。
213デフォルトの名無しさん:2005/06/15(水) 00:55:16
簡単な質問ですみません。
自動変数で、
double d[100];
の配列を一気にすべての要素を0.0に初期化する方法ってありませんか。
int d[100]={0.0,0.0,0.0,, ,,0.0};
っていうのは面倒で間違えそうなので。
初期化のたびにforループで回すのもなんだかなーって思うんです。
214デフォルトの名無しさん:2005/06/15(水) 00:58:15
>>213 double d[100] = {0};
215デフォルトの名無しさん:2005/06/15(水) 00:58:54
std::fill_n(d, 100, 0.0);
216デフォルトの名無しさん:2005/06/15(水) 02:04:55
さっそくのレスありがとうございます。
>>214
それってC++標準なのでしょうか。
VC++6.0だと先頭の要素しか0にならなかったもので...orz
何か間違ったかな。。。
>>215
それはやったことが無いのでためしてみますです。
217デフォルトの名無しさん:2005/06/15(水) 05:23:30
>>211
structに関数が入れられるというのか・・・
218デフォルトの名無しさん:2005/06/15(水) 05:52:47
>>217
C++なら普通にメンバ関数もてるが?
219デフォルトの名無しさん:2005/06/15(水) 06:53:50
or2 < 剥き出しの関数を打ち込んでくれ!
220名無しさん@お腹いっぱい。:2005/06/15(水) 11:41:45
以下のgccでコンパイルすると
test.c: 関数 `main' 内:
test.c:23: 警告: 互換性のないポインタ型からの引数 1 個の `mat_add' を渡しますです
test.c:23: 警告: 互換性のないポインタ型からの引数 2 個の `mat_add' を渡しますです
とエラーが出ます。原因が解かる方お願いします。
#include <stdio.h>
/*--- 2行3列の行列maとmbの和をmcに格納する ---*/
void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3])
{
int i, j;
for (i = 0; i < 2; i++)
for (j = 0; j < 3; j++)
mc[i][j] = ma[i][j] + mb[i][j];
}
int main(void)
{
int i, j;
int ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
int mb[2][3] = { {6, 3, 4}, {5, 1, 2} };
int mc[2][3] = { 0 };
mat_add(ma, mb, mc);
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++)
printf("%3d", mc[i][j]);
putchar('\n');
}
return (0);
}
221デフォルトの名無しさん:2005/06/15(水) 11:46:20
>>220
int (*)[3]からconst int (*)[3]には安全に変換できない。
222220:2005/06/15(水) 11:50:53
>>221
有難うございます。
constを外して以下のようにしたらコンパイルできました。
void mat_add(int ma[2][3], int mb[2][3], int mc[2][3])
223221:2005/06/15(水) 11:54:59
いや、変換自体は安全だな。
安全性をgccが認識していないということか。
まあ、c++ではエラーだから妥当な警告だと思うが。
224デフォルトの名無しさん:2005/06/15(水) 11:57:59
>互換性のないポインタ型からの引数 1 個の `mat_add' を渡しますです
すげー訳だな。
225デフォルトの名無しさん:2005/06/15(水) 13:09:20
32バイトの変数を作る方法ってありますか?
4バイトのint8個の配列を作っても、
int a[8];
a = a & 0x3333333333333333333333333333333333333333333333333333333333333333;
というコードはエラーになってしまうし、
この論理積は単調だからループ処理で4バイトずつ行う事も出来るけど、単調でない場合はかなり面倒です。
226デフォルトの名無しさん:2005/06/15(水) 13:11:49
>>225

  な に を し た い ん だ

そもそも普通はchar a[32]だろ。
227225:2005/06/15(水) 13:25:39
>>226
立っているビットの数を求めるアルゴリズムの中で
>>225に書いたような処理があるのです。
228デフォルトの名無しさん:2005/06/15(水) 13:28:54
>>225
多倍長整数を扱えるライブラリを使うか、自分で実装する。
229デフォルトの名無しさん:2005/06/15(水) 13:40:44
>>225
素直に16進ダンプ文字列とのビット演算するロジックを書けばいいのでは?
230デフォルトの名無しさん:2005/06/15(水) 13:47:22
>>225
int a[8];
int count = 0;
int i;

for( i=0; i<sizeof(a)/sizeof(a[0]); i++ )
{
  count = countbit( a[i] );
}

として、countbit()を実装すればいいだけでは?
231230:2005/06/15(水) 13:48:31
>>230
×count = countbit( a[i] );
○count += countbit( a[i] );

orz
232225:2005/06/15(水) 14:36:03
>>230に言われた通り要素ごとにカウントして合計する方法にします。
レスありがとうございました。
233デフォルトの名無しさん:2005/06/15(水) 22:18:22
すみません。
C言語とかで

(0==hoge)? 10: 20;

とかの判定?について調べたいのですが、これはどういう命令になるのでしょうか?
WEBの検索キーワードは何と入力したら…
234デフォルトの名無しさん:2005/06/15(水) 22:32:08
>>233
条件演算子。
単項・2項演算子と違い3項演算子は条件演算子しか存在しないので条件演算子のことを指して3項演算子とも言われる。

その場合0がhogeなら10、そうでなければ20となる。
こういう風に自然に読むと妙な文章になるからhoge == 0と書け。
235デフォルトの名無しさん:2005/06/15(水) 22:36:58
>>234

ぐはっ!すぐに引っかかった!
しかも見てたサイトで…(涙)

ありがとうございました。
精進します…
236デフォルトの名無しさん:2005/06/15(水) 23:53:57
なんと説明すればいいのかわからないのですが・・・

int型4バイトの整数7777777というものがあったとします。
そしてこれをファイルに書き込もうと、fwrite関数を使ったりしようとすると
整数7777777を文字としなければならず
そうして書き込むと'7'が7個分の7バイトとして書き込まれてしまいます。
この7777777という4バイトの整数値を、ファイルに書き込むときになんとか
4バイトで書き込む方法はないでしょうか?
237デフォルトの名無しさん:2005/06/16(木) 00:00:30
>>236
fprintfで書き込むと文字としての7777777になるけどfwriteで書き込めばsizeof (int)、お前の言う4バイトで書き込まれると思うが。
238236:2005/06/16(木) 00:12:18
>>237
どうすればいいのかわからないです・・・

int num = 7777777;

としたときにこの値をファイルに4バイトで書き込むにはどうしたらいいのでしょう。

fwrite(num,sizeof(int),1,ファイルポインタ)

とするとエラーがでますし

numを文字配列に char *buf = "7777777";
のようにして

fwrite(buf,sizeof(int),1,ファイルポインタ)

とやってもうまくいきません・・・

239デフォルトの名無しさん:2005/06/16(木) 00:16:17
× : fwrite(num,sizeof(int),1,ファイルポインタ);
○ : fwrite(&num,sizeof(int),1,ファイルポインタ);
240236:2005/06/16(木) 00:56:25
>>239
ありがとうございます!
おかげさまでできました!
241デフォルトの名無しさん:2005/06/16(木) 01:57:05
CでN×Nのdoubleの二次元配列aがあったときに、
for (i = 0; i < N; i++) {
 for (j = 0; j < N; j++) {
  a[N * i + j] = 右辺;
 }
}
って書いてるコードがあるんですが、このa[N * i + j]って
a[i][j]と同じであってます?
242デフォルトの名無しさん:2005/06/16(木) 01:59:57
>CでN×Nのdoubleの二次元配列a
Cには配列の配列しかないんだが
とりあえず a[N * i + j] は違うな
243デフォルトの名無しさん:2005/06/16(木) 02:09:30
>>158
うぉ 質問しようとしたことがそのままかかれとる。
結局ansi.sysはさほど意味がなかったのねorz
244デフォルトの名無しさん:2005/06/16(木) 02:10:08
>>242
違うと言うのは?
Cの参考書に書いてあるコードなので、100%とは言いませんが、ある程度信頼できるかと思うのですが。
245デフォルトの名無しさん:2005/06/16(木) 02:13:10
a[N * i + j]ってのは一次元の配列をさも二次元配列のように扱うための常套手段ではあるが。
246デフォルトの名無しさん:2005/06/16(木) 02:20:42
>>241
aの型が double * ならそのコードで正しい
aの型が double (*) [N] なら間違い

double [N][N]の配列を指すポインタの型は本来 double (*) [N]だ。
だから、aの型が double * なら、double[N][N]の二次元配列を指すには
キャストが必要になる。

ま、たまたまCの二次元配列のレイアウトはそうなってるから、
キャストして、そのコードのように一次元配列のように扱うこともできる。
247デフォルトの名無しさん:2005/06/16(木) 07:26:57
>ま、たまたまCの二次元配列のレイアウトはそうなってるから、

それって標準でそうなってるの?
248デフォルトの名無しさん:2005/06/16(木) 11:10:02
>>247
Cの所謂二次元配列は配列の配列でしかないから必然的にそう為らざるを得ないね。
249デフォルトの名無しさん:2005/06/16(木) 15:03:05
// time1.h
// Timeクラスの定義
// メンバ関数はTIME.CPPの中で定義

// ヘッダファイルを重複してインクルードするのを防ぐ
#ifndef TIME1_H
#define TIME1_H

// 抽象データ型(ADT)Timeの定義
class Time {
public:
Time(); // コンストラクタ
void setTime(int, int, int); // 時,分,秒を設定する
void printMilitary(); // 軍事形式で時刻をプリントする
void printStandard(); // 標準形式で時刻をプリントする
private:
int hour; // 0〜23
int minute; // 0〜59
int second; // 0〜59
};

#endif

↑コンパイル出来ましぇん(T_T)
宣言の構文エラーとか表示されます
250デフォルトの名無しさん:2005/06/16(木) 15:17:23
>>249
コンパイルした方法とエラー内容を正確に示そう
251デフォルトの名無しさん:2005/06/16(木) 15:18:09
cとしてコンパイルしているか、他でTimeが宣言されているんジャマイカ。
252デフォルトの名無しさん:2005/06/16(木) 15:22:11
>>250
ボーランドのコンパイラを使っております
上のファイルをコンパイルしたところ
「宣言の構文エラー」でコンパイルに失敗しました
どうやらエラー箇所は「class Time{」
という行にあるみたいです.

>>250
確かに他でTimeが宣言されていますが,
名前を全く違うものに変更しても同じエラーが発生しました
253デフォルトの名無しさん:2005/06/16(木) 15:26:15
だから、どうやってコンパイルしたかを正確に書けと言ってるじゃない
か。

bcc time1.h

とかしてないよね?

254デフォルトの名無しさん:2005/06/16(木) 15:29:22
思いっきりそうしてます
コンパイルはアプリケーションまかせなので・・・
どうやら間違った方法のようですね
正しい方法を教えてくださいm(_ _)m
255デフォルトの名無しさん:2005/06/16(木) 15:38:38
それって、やっぱりCとしてコンパイルしているんジャマイカ。
256デフォルトの名無しさん:2005/06/16(木) 15:41:44
bcc32.exeしか持ってないんですけど
これじゃ駄目なんですか??
257デフォルトの名無しさん:2005/06/16(木) 15:46:33
//>>256
//めんどくせぇからこれをfoo.cppとしてbcc foo.cppしろ。
#include "time1.h"
258デフォルトの名無しさん:2005/06/16(木) 15:54:03
c++としてコンパイルさせる場合はどうしたらいいんですか??
確かにC++Builderとあるのに・・・
259デフォルトの名無しさん:2005/06/16(木) 15:55:07
260デフォルトの名無しさん:2005/06/16(木) 15:57:18
ヘッダファイル .h はコンパイルする必要はない。
261デフォルトの名無しさん:2005/06/16(木) 16:02:55
>>260
そうなんですか!?
全然知らなかった・・・

今度は先ほどのtime1.hをインクルードしたプログラムを作ったのですが(time1.cpp)
これをコンパイルすると

外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

というエラーが発生しました.
main関数は絶対必要なんですか??
time1.cppの中にはmain関数はないのですが・・・
262デフォルトの名無しさん:2005/06/16(木) 16:04:31
それくらい自分で調べられないならプログラミングをやめて首吊って氏ね
263デフォルトの名無しさん:2005/06/16(木) 16:10:13
初心者歓迎というのは嘘でつか??
ここはC++の勉強を一方的に教える諸サイトと違って
インタラクティブに解決できると思ったのに・・・
参考書に書いてある通りにしてできないものをどう調べろと??
調べてもいいけど、これってC++の文法云々じゃない気がする
264デフォルトの名無しさん:2005/06/16(木) 16:11:04
>>262
初心者歓迎なんだから、それはさすがに言いすぎ。

>>261
exeファイルを作りたいなら、main関数は必要だよ。
でないと、どこから実行したらいいかわからないからね。
265デフォルトの名無しさん:2005/06/16(木) 16:14:25
>>261
おい待てコラ
>>249でヘッダのコメントに書いてある

    // メンバ関数はTIME.CPPの中で定義

はどうしたんだよ
わざわざ新しくtime1.cppなんて作らんでも、上記のTIME.CPP使えばええじゃないか
266デフォルトの名無しさん:2005/06/16(木) 16:17:09
つーか、>257、>259は蒸し貝。
267デフォルトの名無しさん:2005/06/16(木) 16:17:23
>>264
構造的には

time1.hというヘッダファイルがあって
time1.cppというプログラムがtime1.hをインクルードしてて(ここで実装している)
list06_05.cppというプログラムがドライバとしてテストしている(ここにmain関数あり)

というものです。
list06_05.cppを実行しようとすると,Timeという型が理解できないと言われたので
やはり原因は
>>249
のプログラムにあると思ったのですがいかがなもんでしょう??
268デフォルトの名無しさん:2005/06/16(木) 16:21:16
>>267
list_06_05.cppではinclude "time1.h"してる?
269デフォルトの名無しさん:2005/06/16(木) 16:26:59
>>268
( ; ° °)
どうやら"time1.h"を"time.h"にしてたようですm(_ _)m

それでもまだ動きません。
list_06_05.cppに
「注意: TIME1.CPPと一緒にコンパイルすること」
とあるのですが,ひょっとしたらこれかもと今ふと思いました。
ひょっとして同時にコンパイルとかも可能なんですか??
270デフォルトの名無しさん:2005/06/16(木) 16:27:46
>>267
最初からこの内容で質問しろ。
>list06_05.cppを実行しようとすると,Timeという型が理解できないと言われたので
>やはり原因は
>>249
>のプログラムにあると思ったのですがいかがなもんでしょう??
大間違い。初心者が正確な判断できるわけ無いのだから自分の判断で情報を小出しにしないこと。

>>268に加え、list06_05.cppとtime1.cppを同時にコンパイルして実行ファイルを作らせたらいいはず。
271デフォルトの名無しさん:2005/06/16(木) 16:28:46
>>269
>list_06_05.cppに
>「注意: TIME1.CPPと一緒にコンパイルすること」
>とあるのですが,ひょっとしたらこれかもと今ふと思いました。


おまえ馬鹿だろう。
272デフォルトの名無しさん:2005/06/16(木) 16:32:29
>>271
馬鹿ですね。
でも一緒にコンパイルするなんてこと分からなかったから
仕方ないじゃないですか(言い訳)

みんな厳しいけどいい人ばっかやね。
273デフォルトの名無しさん:2005/06/16(木) 16:35:16
>>272
仕方が無いなんて無い
274デフォルトの名無しさん:2005/06/16(木) 16:42:49
ソースコードにコンパイル時の注意がコメントされているのに
それを思いっきり無視して自分の思い込みだけで対処しようとするところが
馬鹿なの。
275デフォルトの名無しさん:2005/06/16(木) 17:11:12
とりあえず>>249はコマンドラインコンパイラの引数について勉強するといいお^^

っ[ -P -c ]
276超初心者:2005/06/16(木) 18:12:10
お恥ずかしい質問になると思うですが、自分なりに調べてもよく
わからなかったので、質問させてください。
「C言語による、外部ファイルへの出力方法を調べろ」と言われたのですが
外部ファイルすらよくわからず、どなたか説明できないでしょうか。。
勉強不足ですみません。
277デフォルトの名無しさん:2005/06/16(木) 18:16:21
初心者を超えたら初心者じゃないから歓迎しない。
278デフォルトの名無しさん:2005/06/16(木) 18:21:26
>>276
OSのファイルシステム上に存在するファイルって意味じゃないか?
平たく言えばごく普通のファイル。
279超初心者:2005/06/16(木) 18:28:51
>>277
すみません。。
>>278
ありがとうございます!けれど、外部ファイルのことはわかった
のですが、出力方法というのがいまいちぴんとこないのですが
お教えいただけないでしょうか。。?
280デフォルトの名無しさん:2005/06/16(木) 18:29:43
>>279
fopenでファイルを開いてfprintfで書き出してfcloseで閉じる。
こんな流れ。
281デフォルトの名無しさん:2005/06/16(木) 18:35:26
しかしそこでstd::ofstream使って怒られるのがナウでヤング
282デフォルトの名無しさん:2005/06/16(木) 18:35:57
略して
283デフォルトの名無しさん:2005/06/16(木) 18:36:08
>>281
>>276
>「C言語による、外部ファイルへの出力方法を調べろ」
284デフォルトの名無しさん:2005/06/16(木) 22:09:17
以下のプログラムを書いてみたんですけど
#include <stdio.h>

int main()
{

double a,b,c,x,y;

scanf("%lf",&a);
scanf("%lf",&b);
scanf("%lf",&c);
scanf("%lf",&x);

y = (c-(a*x))/b;

printf("%lf\n",y);

return 0;

}

b!=0でないという条件がある場合どのように書き加えたらよろしいでしょうか?
また
a1*x + b1*y = c1
a2*x + b2*y = c2
のx,yを求めるプログラムを作る場合の
x,yの求め方を教えていただきたいです。
これも条件があって
a1*b2 != a2*b1
になります
285デフォルトの名無しさん:2005/06/16(木) 22:14:33
>>284
>b!=0でないという条件がある場合
何の条件だ?
入力にその条件を期待してよいと言うことなら、コードに変更の必要はない。
286AA:2005/06/16(木) 22:57:55
ウィンドウが非アクティブ状態でもキーボードの
押された文字が取得できるようにするにはどうしたらいいんでしょうか?
聞くところによるとフックという物を使うそうなのですが...
それが用わかりません。
287デフォルトの名無しさん:2005/06/16(木) 23:07:50
288デフォルトの名無しさん:2005/06/16(木) 23:52:51
main()
{
char a,b;

scanf("%d",&a);
printf("%d\n\n",a);

scanf("%d",&b);
printf("%d\n",b);

printf("%d",a); ←ここでaが0になるんだけどなんででしょうか?

printf("%d\n",a+b);
}
289デフォルトの名無しさん:2005/06/16(木) 23:56:50
>>288
これこれ、scanf()に"%d"と指定しておきながらcharのアドレスを渡しちゃ
いかん。scanf()はその書式指定を信じて、そのアドレスからsizeof(int)分の
領域に書き込むからメモリが壊れるぞ。

一方、printf()に渡すのはかまわんがな。
290デフォルトの名無しさん:2005/06/16(木) 23:57:26
>>288
>scanf("%d",&b);
この段階で、aを壊している。

当然、scanf("%d",&a); もダメ。
charに代入したいなら一旦intで受けてからコピーすべし。
291288:2005/06/17(金) 00:04:43
>>289
>>290
int使えばいいんですね。
ありがとうございます!
292デフォルトの名無しさん:2005/06/17(金) 00:15:39
>>284
連立方程式を解く機械的な方法を考えて、その通りに実行するプログラムを書くだけ。
293デフォルトの名無しさん:2005/06/17(金) 00:27:29
soukoというファイル内に100バイトのサイズの固まりと500バイトの固まりが
?個、交互においてあります。
このファイル自体のサイズは調べずに?個の100バイトの固まりを
ファイル内からすべて取り出しなさい。
とあったので以下のようにすると永遠に動き続けてしまいます。
一体何処が悪いのでしょう?

100バイト
500バイト
100バイト
500バイト
  ・
  ・
  ・
100バイト
500バイト

main(){

FILE *fp = fopen("souko","rb");
char buf[200];
int total = 0;

while(feof(fp) == 0){
fread(buf,100,1,fp);
total++;
bufの中身クリア;
fseek(fp.500,SEEK_CUR)
} //無限ループになってしまう
294デフォルトの名無しさん:2005/06/17(金) 00:28:20
工工エエェェ(´д`)ェェエエ工工
295デフォルトの名無しさん:2005/06/17(金) 00:33:33
>>293
>fseek(fp.500,SEEK_CUR)
これは何のジョークかね?
fseek(fp, 500, SEEK_CUR);
の間違いだよなもちろん。

で、feof()だけじゃなくferror()もチェックしたらどうよ。
296デフォルトの名無しさん:2005/06/17(金) 00:33:57
ふー、落ち着け、落ち着け。
まだ人類が負けたと決まったわけでは無い。
297デフォルトの名無しさん:2005/06/17(金) 00:37:08
>>293
fread()の戻り値をチェックせよ。
298デフォルトの名無しさん:2005/06/17(金) 00:38:57
>>293
fseekを行うとeofが返ってこなくなるよ。
299デフォルトの名無しさん:2005/06/17(金) 00:41:59
>>296
大阪では3台撃墜したらしいしな
300デフォルトの名無しさん:2005/06/17(金) 00:51:32
C++ 移植性ガイド version 0.8 by David Williams 27 March 1998
http://www.mozilla-japan.org/hacking/portable-cpp.html

この文書は古いから、移植性の高いコードを書く時も、
ここに書いてあること全部無視してもいいんですよね?
301デフォルトの名無しさん:2005/06/17(金) 00:57:33
>>300
どれぐらいのポータビリティが必要かによるだろ

Cで本気でポータビリティを求めるなら(未だに)K&Rスタイルで書くか、
ansi2knr.cを添付するかしなきゃいかんワケだし

一方、(たとえば)boostは十分ポータブルだと考えるなら、そこの
記述の多くは古くて無視可能なものだろうな
302デフォルトの名無しさん:2005/06/17(金) 00:58:03
もうだめだ・・・。
303デフォルトの名無しさん:2005/06/17(金) 01:00:33
>>300
そうでもない。
304デフォルトの名無しさん:2005/06/17(金) 01:57:10
独習Cと独習C++の例題と問題を一通り理解して簡単なプログラムは作れるようになったのですが
DOS窓に計算結果や文字が表示されたりするだけのプログラムを作るだけで終わってしまいました。
Windowsアプリやimodeのアプリ、Perlを使った掲示板等を作ってみたいのですが、一体自分は今
どのあたりまで到達しているのでしょうか?100%中10%位?
500ページもある本を二冊も読んだのにDOS窓の中で動くプログラムしか作れない現実に絶望気味ですorz
305デフォルトの名無しさん:2005/06/17(金) 01:59:34
>>304
なに目指すかによるね。
306デフォルトの名無しさん:2005/06/17(金) 02:03:08
とりあえずペイントブラシ程度のものを・・・。
307デフォルトの名無しさん:2005/06/17(金) 02:05:04
>>304
ようやくパーセンテージが付けられるようになった状態。つまり0%。
308デフォルトの名無しさん:2005/06/17(金) 02:06:00
>>307
永遠に終わらぬではないか。
309デフォルトの名無しさん:2005/06/17(金) 02:07:07
>>308
環境非依存の内容が終わったところだったら、まだ出発点じゃない?
310デフォルトの名無しさん:2005/06/17(金) 02:07:48
ペイントブラシって知らないけどウインドウズのおまけみたいなのと仮定すると
40%〜50%くらい?ちょっと甘いかな。
311デフォルトの名無しさん:2005/06/17(金) 02:11:39
>>309
環境非依存ってなんですか?

>>310
0%と40%じゃえらく違うな・・・。
もう半分は来ているのか。
312デフォルトの名無しさん:2005/06/17(金) 02:15:24
100%は何なんだ
C++コンパイラが書けたら100%っていうんならべつに
Windowsプログラミングの知識なんぞ要らないぞ
313デフォルトの名無しさん:2005/06/17(金) 02:17:51
宿題スレで組み立てていただいたプログラムなのですが、
難しくて自分で説明ができません。

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

void swap(int *a, int *b)
{
int tmp;
tmp = *a, *a = *b, *b = tmp;
}
void random_shuffle(int *start, int *last)
{
int *next = start;
size_t index;

for (index = 2; ++next != last; ++index)
swap(next, start + (rand() % index));
}
main()
{
int i;
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

srand(0);
random_shuffle(array, array+10);
for (i = 0; i < 10; ++i)
printf("%d\n", array[i]);
}


314デフォルトの名無しさん:2005/06/17(金) 02:18:05
{
int *next = start;
size_t index;

for (index = 2; ++next != last; ++index)
swap(next, start + (rand() % index));
}


int i;
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

srand(0);
random_shuffle(array, array+10);
for (i = 0; i < 10; ++i)
がわからないのですがどういうことなのでしょうか?
とくに配列のarrayの使い方とindexがよくわかりません
315デフォルトの名無しさん:2005/06/17(金) 02:18:20
中学レベルの英文法を勉強したくらい。
316デフォルトの名無しさん:2005/06/17(金) 02:20:45
>>312
>>306
馬鹿。
317デフォルトの名無しさん:2005/06/17(金) 02:23:37
ペイントブラシみたいなソフトとまでは行かなくても、グラフィック表示したり
音を出したりする位のことは簡単にできるんじゃないのかと思っていたのですが
1000ページ読んで出てきたのは文字と\a記号のビープ音orz
どうやったら文字とビープ音だけの世界から抜けられるのでしょうかorz
318デフォルトの名無しさん:2005/06/17(金) 02:25:15
イントの箱が10個ありまんねん。
一つ目には1、二つ目には2とはいってますにゃ。
それをぐちゃぐちゃっと。
319デフォルトの名無しさん:2005/06/17(金) 02:27:55
>>313
絵に描いて考えろ。話はそれからだ。




こんな夜中に釣られるテシト
320デフォルトの名無しさん:2005/06/17(金) 02:31:43
>>317
マジレスすると開発環境買って来い。
VCでもBCBでもいいから。
321デフォルトの名無しさん:2005/06/17(金) 02:32:37
↑補足
1000ページ勉強したことは開発環境を使う上で無駄にはならんから安心しろ。
322デフォルトの名無しさん:2005/06/17(金) 02:35:41
>>320
MSのVC++2005Expressならありますが・・・これじゃだめ?
ただで配るなんてMSも腹が太い。
323デフォルトの名無しさん:2005/06/17(金) 02:38:26
>>322
とりあえず勉強にはそれでいいから、次はGUIの勉強をしなさい。
324284:2005/06/17(金) 02:42:19
流れを切って申し訳ないのですが・・・
a1*x + b1*y = c1
a2*x + b2*y = c2

の連立方程式のx,yを導き出す方法が思いつきません
どのようにx =
y =
とすればよいのでしょうか・・・
よろしければご教授いただければと思います。
325デフォルトの名無しさん:2005/06/17(金) 02:44:22
>>324
それ中学校の数学
著しくスレ違い&板違い
自分でなんとかしろ
326デフォルトの名無しさん:2005/06/17(金) 02:47:40
>>313
random_shuffle()の中で、
1) nextポインタはstartが指す配列の1, ... 9番目という具合に動く。
2) indexは、2, 3, ... 10の範囲を動く。
3) rand() % indexの結果は、
  0〜1, 0〜2, 0〜3... 0〜9
  の範囲を動く。
4) そして、swap()によって、配列の
 1番目と、0〜1番目のいずれか
 2番目と、0〜2番目のいずれか
 3番目と、0〜3番目のいずれか
  :
 を交換している。これで、配列の要素を「シャッフル」しているわけだ。

arrayの使い方がよくわからないってのは、よくわからないな。
int array[] = { 1, 2, ... };
は、要素数10コのintの配列を宣言すると同時に初期化している。
random_shuffle()の呼び出しでは、配列の先頭のポインタと、配列の末尾
を一個超えたポインタを、終端として渡している。これはたまたま、
random_shuffle()が、そういう風に作ってあるからだ。

327313:2005/06/17(金) 03:52:56
>>318,319
そこまではなんとかわかります。
10個の箱があってそれぞれに1〜10までの数値が入っていてそれをごちゃ混ぜにしたのを
頭から表示させているんですよね?
いま悩んでいるのは、このプログラムを構成している途中経過を説明するように言われて
これをどう説明すればいいのかわからなくて困っているのです。
わかりにくい書き方をして申し訳ありませんでした
328313:2005/06/17(金) 04:02:53
>>326
詳しい説明ありがとうございます!
授業でポインタは「うまく説明できないから」と飛ばされてしまったのでよくわかっていなかったのと、
授業で配られた資料のなかにarrayに関するものがなかったので理解に困っていました。
329デフォルトの名無しさん:2005/06/17(金) 09:47:26
> 授業でポインタは「うまく説明できないから」と飛ばされてしまった

どんな授業だよw
330デフォルトの名無しさん:2005/06/17(金) 09:52:17
>>329
大学や専門学校の授業の平均像なんてこんなもんだ。
331デフォルトの名無しさん:2005/06/17(金) 09:54:36
>>330
大学もかよ(w
332デフォルトの名無しさん:2005/06/17(金) 09:54:41
文系学部の教養なら許容範囲だが。。。
333デフォルトの名無しさん:2005/06/17(金) 09:58:19
Windows2000, MFC, VC++6.0です。
デフォルトのコントロールのフォントはMS Pゴシックですよね。
これだと韓国語や中国語は表示できません。
で、フォントをArialにすると、韓国語や中国語、日本語やその他の言語も表示できたんですが、
Arialって文字コード表で見ると日本語や韓国語などは含まれていません。
なのになぜ表示できるんでしょうか。
同じようにMSPゴシックには韓国語は含まれていないのですが、Arialとの違いは何なのでしょうか。
また、フォントにない文字はおそらく他のフォントが割り当てられているのでしょうが、そのフォントは何なんでしょうか。
334デフォルトの名無しさん:2005/06/17(金) 10:11:31
FontLinkでググれ
335デフォルトの名無しさん:2005/06/17(金) 11:10:35
>>331
うちの大学なんか、ソースコードをサブディスプレイに表示して
教授眠くなるような口調で延々と読み上げるだけだったぞw
説明一切なしで、学科の80%の人間は理解不能。
FDDでコピーがあたりまえだった。
もうねアホかとバカかと小一時間問いつめたくなったね。
ワープロの講義だろこれ。と。
336333:2005/06/17(金) 12:36:41
>>334
ありがとう。助かりました。
337331:2005/06/17(金) 14:07:02
>>335
畑は違うが、教科書棒読みあだ名がラリホーという講師は確かにどこにでもいたなぁ。
338デフォルトの名無しさん:2005/06/17(金) 14:07:26
ファイル(バイナリ)の読み込みで質問があります。

おもにWisdomSoftのC言語入門を参考に、猫でもも見てCの勉強はじめたのですが
ファイルサイズの取得方法が解りません。
バッファ式とでもいうのでしょうか? 数バイトづつの読み書きは説明もあり解るので
すが、読み込みたいファイルに合わせてメモリ確保したいのです。
339デフォルトの名無しさん:2005/06/17(金) 14:33:11
fseekでファイル末端へ移動したあとftellすればファイルサイズわかるんでないの。
340デフォルトの名無しさん:2005/06/17(金) 14:38:43
>>338
ファイルサイズを取得する方法は幾つかあるが、完全に移植性のある方法は(現実的な範囲では)ない。
・標準関数を使う方法
fopen()してfseek()で末尾に移動、ftell()でオフセットを得る。
・stat()を使う方法
Windowsだと_stat()かな? fstat()でもいいかもしれない。
・APIを使う方法
GetFileSize()

尚、2GBを超えるサイズのファイルの場合はこれらの手法が使えないので注意。
341デフォルトの名無しさん:2005/06/17(金) 15:04:42
>>339殿、>>340殿ありがとうございます。<(_ _)>

標準関数にはGetFileSize()のようなのはないのですね。
アセンブラで書いたものをCではどうやるのか勉強していまして、
質問させて頂きました。
stat()というのは知らないので勉強して決めたいと思います。
ありがとうございました。
342デフォルトの名無しさん:2005/06/17(金) 15:13:22
>>329
>ポインタは「うまく説明できないから」

これはなかなか至言だ
343デフォルトの名無しさん:2005/06/17(金) 15:16:06
>>337
詐欺だよな。あれは。
大学というのは資格ビジネスなのか所詮・・・。
344デフォルトの名無しさん:2005/06/17(金) 15:19:13
>>340
GetFileSize()は2GB超もいけるだろ。

まぁ、どのみち32bit版Windowsで2GB超のファイルを一気にメモリ上に取り込むこと自体不可能に近いが。
2GB未満でもバカでかいファイルを一気にメモリに読み込むのは阿呆だけどな。
まぁCreateFileMapping()とかあるが。
345デフォルトの名無しさん:2005/06/17(金) 15:46:38
>>340
ここWin限定とかじゃないから、Win32APIと書いた方がいい気がするが。
346ham:2005/06/17(金) 16:41:22
長いので分けます。
質問,下記をコンパイルすると最初の関数宣言
”void max(int study[][SUB],int STU);”でエラーになります。
なぜですか?教えて下さい。
347デフォルトの名無しさん:2005/06/17(金) 16:43:32
>>346
エラーメッセージを書くこと。
以上。

はい、次。
348ham:2005/06/17(金) 16:45:45
346です。
#include <stdio.h>

#define SUB 3 /*科目*/
#define STU 5 /*生徒人数*/
void max(int study[][SUB],int STU);
void average(int study[][SUB],int STU);
int main(void)
{
int study[STU][SUB];
int i,j;

puts("点数を入力してください。");
for(i=0; i<STU; i++){
for(j=0; j<SUB; j++){
printf("生徒 No%d",i+1);
switch (j){
case 0 : printf("国語"); break;
case 1 : printf("数学"); break;
case 2 : printf("英語"); break;
}
scanf("%d",&study[i][j]);
}
}
average(study,STU);
max(study,STU);

return 0;
}
349ham:2005/06/17(金) 16:47:00
346です。つづき
/*平均点*/
void average(int study[][SUB], int STU)
{
int i;
int l,m,e;

for(i=0; i<STU; i++){
l+=STU[i][0];
m+=STU[i][1];
e+=STU[i][2];
}
printf("国語の平均 %d\n",l/STU);
printf("数学の平均 %d\n",m/STU);
printf("英語の平均 %d\n",e/STU);
}
350ham:2005/06/17(金) 16:47:20
/*各科の最高得点*/
void max(int study[][SUB],int STU)
{
int i,j;
int l_max,m_max,e_max;
l_max=m_max=e_max=study[0][0];


for(i=0; i<SUB; i++){
for(j=0; j<STU; j++){
if(i==0 && l_max<study[i][j])
l_max=study[i][j];
if(i==1 && m_max<study[i][j])
m_max=study[i][j];
if(i==2 && e_max<study[i][j])
e_max=study[i][j];
}
}
printf("国語の最高 %d\n",l_max);
printf("数学の最高 %d\n",m_max);
printf("英語の最高 %d\n",e_max);
}
351ham:2005/06/17(金) 16:48:51
以上です。
コンパイルすると
error C2143: 構文エラー : ')' が 'constant' の前に必要です。
C:\Documents and Settings\mol\mols\lesson1\baka2.cpp(5) : error C2143: 構文エラー : ';' が 'constant' の前に必要です。
C:\Documents and Settings\mol\mols\lesson1\baka2.cpp(5) : fatal error C1004: 予期せぬ EOF が検出されました
と表示されます。
352デフォルトの名無しさん:2005/06/17(金) 16:49:53
宣言時にサイズが不定だからでは?
353デフォルトの名無しさん:2005/06/17(金) 16:50:06
>>348
STUがdefine定数だから、
void max(..., int STU);
は展開されて
void max(..., int 5);
になる。よって、エラー。
以上。

はい、次。
354ham:2005/06/17(金) 17:19:33
回答ありがとうございます。
ですが判りません。すいません。
引数のSTUがdefine定数で5じゃダメなんですか?
展開のことをもう少し追加説明をよろしくお願いします。
355デフォルトの名無しさん:2005/06/17(金) 17:34:26
>>354
駄目、駄目。
STUがどうのではなく
int hoge としたら hogeは未定義の名前でなければならない。
即ち宣言なんだが。

コンパイラが解釈する前に展開される。
この場合の展開は置換のようなもの。
コンパイラは5という定数は変数に使えないからエラーにしている。

356デフォルトの名無しさん:2005/06/17(金) 17:45:08
Windowsフォームアプリケーションについて解説してる書籍か
サイトないですか?
357デフォルトの名無しさん:2005/06/17(金) 17:45:31
ちなみにVC++.net2003です。
358ham:2005/06/17(金) 17:46:42
意味が判りました。
丁重にありがとうございました。
359デフォルトの名無しさん:2005/06/17(金) 18:07:17
*.hと*.hppの違いを教えてください。
360デフォルトの名無しさん:2005/06/17(金) 18:16:46
hppは「これはC++用のインクルードファイルじゃヴォケ!」という自己主張。それだけ。
361デフォルトの名無しさん:2005/06/17(金) 18:20:38
>>324
二次方程式を解くアルゴリズムが思いつかないってことか?
掃き出し法でググれ
362361:2005/06/17(金) 18:22:18
すまん二元連立一次方程式のまちがい
363デフォルトの名無しさん:2005/06/17(金) 20:53:42
ランダム関数を使う時、どうにも発生するら乱数が十分に見えない場合はどう改善すればいいんでしょうか
364デフォルトの名無しさん:2005/06/17(金) 20:55:45
>>363
右シフトしてみたりMTを使ってみたりする。
365デフォルトの名無しさん:2005/06/17(金) 21:01:33
>>364
右シフトして意味あるの? underflow起こしたり、有効桁数がなくなるだけじゃない?
366デフォルトの名無しさん:2005/06/17(金) 21:07:46
>>365
大体の擬似乱数は下位ビットの精度が悪いことが多い。
367デフォルトの名無しさん:2005/06/17(金) 21:19:07
>>363
とりあえず環境/実装系依存でない程度の話なら、
CFAQ参照

ttp://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-13.html
の13.16だ。
368デフォルトの名無しさん:2005/06/17(金) 22:03:49
>>367
見ました
ちょっとイジってみたんですけど、ちょっとマシになったくらいかな?って感じです
まだ初心者の身分なんで、あまりに難しそうなところは飛ばして読んだんですが、助かりました
369デフォルトの名無しさん:2005/06/17(金) 23:29:06
ここに質問してもいいのか悩んだのですが、質問させてください。

SNESの音楽データフォーマット、SPCファイルにかかれている
ID666の情報を取得して、リストとして表示するプログラムを考えています。
ID666におけるヘッダ情報はいろんなサイトを巡って見つけたのですが、
曲名に当たる部分が32バイトしかありません。
中には32バイト以上の曲名も存在します。

そのようなSPCファイルをWinampで読み込ませてみたところ、きちんと曲名が表示されています。
しかしID666における曲名該当部分には、曲名の途中までしか入っていません。

このような曲名が長い場合、どこに曲名がかかれているのか、
また、どうやって曲名が長いファイルを自動選別できるか、
よろしければご教授おねがいします。

開発環境はWindows2000、コンパイラは失念しました。
たしかGCCだったと思いますけど・・・。
370デフォルトの名無しさん:2005/06/17(金) 23:38:03
拡張ヘッダとか称して別の場所に名前を埋めてるんじゃないの?
371デフォルトの名無しさん:2005/06/18(土) 00:31:36
バイナリエディターで検索かければおおよその位置が判り
何をやっているかわかるかもしてない。
372デフォルトの名無しさん:2005/06/18(土) 01:21:49
>>369
それはファイルフォーマットの質問であって、
C/C++の質問じゃないだろう。
373デフォルトの名無しさん:2005/06/18(土) 01:43:50
すいません、ではどこで質問したらいいでしょうか・・・
374デフォルトの名無しさん:2005/06/18(土) 01:58:31
ローカルルールを読めばとりあえずどこに行くべきかわかりそうなものなんだがなぁ・・・
375デフォルトの名無しさん:2005/06/18(土) 02:28:22
SPCのデコーダ作ってる人に聞いてみるとかね(俺ならそうする)
376デフォルトの名無しさん:2005/06/18(土) 04:31:08
>>369
ぐ ぐ れ (俺ならそうする)

"ID666" でぐぐって上から三つ目、
ttp://www.alpha-ii.com/snesmusic/tutorials/eid666.html
からリンクをたどって
ttp://www.alpha-ii.com/snesmusic/files/spc_file_format.txt
を見れば、曲のタイトルを256バイトまで拡張する方法が書いてある。
377デフォルトの名無しさん:2005/06/18(土) 10:47:16
fread()について教えてください。 VC6です。

ファイルサイズ分malloc()で確保したメモリに読み込みなんですが、
読み込み後4バイト単位で扱ったり1バイトで扱ったりします。
なので、読み込めればさえいいのですが。

size_t fread(void *バッファ , size_t サイズ , size_t カウント , FILE *ストリーム);

のsize_t サイズ , size_t カウント ,をどうすればいいのか決めあぐねています。
一応size_t サイズにファイルサイズを、size_t カウントを1としたものと、
size_t サイズを1に、size_t カウントをファイルサイズ分にしたものをビルドし実行
しましたところちゃんと読み込めているようなのですが、これでいいのでしょうか?
よろしくお願いします。
378デフォルトの名無しさん:2005/06/18(土) 10:55:56
>>377
基本的には戻り値に影響するだけなんで、適当に選べばいい。
あとは、パフォーマンスが違うかもしれない。(環境依存だろうけど)
379デフォルトの名無しさん:2005/06/18(土) 10:59:30
VC7.1ではsize * countとしていた。VC6もそんなんじゃない?
380& ◆po73KQOmZk :2005/06/18(土) 11:01:25
テキストを読むために

#include <stdio.h>

struct info
{
char* name; /* 名前 */
int age; /* 年齢 */
char* sex; /* 性別 */
};
int main(void)
{
struct info data;
FILE *fp;
int i;
fp = fopen( "test.txt", "r" );
if( fp == NULL )
{
puts( "test.txtが開けません" );
return 1;
}
for(i=0; i<5 && !feof(fp); ++i) /* 5人分読み込む又はファイル末尾で終了 */
{
fscanf( fp, "%s %d %s", data.name, &data.age, data.sex );
printf( "%s %d %s\n", data.name, data.age, data.sex );
}
fclose( fp );
return 0;
}
こうすると強制終了されますが、なぜなの??文字列をポインタで扱うときのやり方に間違い
があるっぽいんだけど、どこを間違えてるのか教えてください
381デフォルトの名無しさん:2005/06/18(土) 11:05:52
>>380
>fscanf( fp, "%s %d %s", data.name, &data.age, data.sex );
ここで、data.nameとdata.sexは何も指していない。
fscanfに渡すポインタは有効なオブジェクトを指していないといけない。
382質問です:2005/06/18(土) 11:22:33
fstreamでバイナリーデータをバイト数を指定して出力する方法を教えて下さい。
どこのサンプルを見ても文字列出力ばかりでわかりやすいサンプルが見つかりませんでした。
383デフォルトの名無しさん:2005/06/18(土) 11:26:36
>>377殿、>>379殿、素早い解答ありがとうございます。<(_ _)>

戻り値については全く考慮していなかったので注意したいと思います。
ちょっと難しく考えすぎていたのでしょうか? 標準関数については警告
やエラーが出なければ良しとし進めたいと思います。

ありがとうございました。
384デフォルトの名無しさん:2005/06/18(土) 11:26:54
>>382 std::ostream::write
385383:2005/06/18(土) 11:27:53
>>378殿、>>379殿の誤りです。
失礼しました。
386質問です:2005/06/18(土) 11:27:55
>>384
ありがとうございます(*´∀`)
387デフォルトの名無しさん:2005/06/18(土) 11:28:04
>>383
C/C++でその進め方は危ない。マニュアル(VCならMSDN)見て判断しろ。
388デフォルトの名無しさん:2005/06/18(土) 11:47:48
195バイトのファイルを開いたとして、
size_t foo = fread(buffer, 100, 10, fp);
すると100バイト読み込んでfooは1、
size_t foo = fread(buffer, 10, 100, fp);
すると190バイト読み込んでfooは19。
389デフォルトの名無しさん:2005/06/18(土) 11:56:36
int main(void)
{
  short S;
  long L = 0x10008000;
  printf("S=L= %x\n", S = L);
}

このプログラムの動作はどういう風に説明すればいいいのでしょうか?


int counter = NULL;
char strings[MAX] = NULL;
memset(&structX, '\0', sizeof(structX));
char *cp = '\0';

このコードの間違いはどれなのかおしえてください。
390デフォルトの名無しさん:2005/06/18(土) 12:05:40
>>388
指定要素数分全部読み込めない場合のファイルポインタ移動量は
必ず要素サイズの倍数になる、って決まってるの?
391デフォルトの名無しさん:2005/06/18(土) 12:07:33
>389
格上げ、符号拡張、NULL
392デフォルトの名無しさん:2005/06/18(土) 14:23:08
> int counter = NULL;
> char strings[MAX] = NULL;
死罪
393デフォルトの名無しさん:2005/06/18(土) 14:29:27
NULL ポインタ変数向けの型なのでintに入れちゃいかん
配列の初期定義にも使えない
&structX
ぬるぽ
394デフォルトの名無しさん:2005/06/18(土) 14:40:58
C++ではNULLはただの0だがなー
395デフォルトの名無しさん:2005/06/18(土) 15:01:52
C++の場合型チェックが厳しくなったために「voidポインタを,この型のポインタ変数に代入できない」
という意味のエラーを出し使い物にならないから苦肉の策として
0 を「ポインタがオブジェクトを参照していないことを示すポインタリテラル」にしたので
396デフォルトの名無しさん:2005/06/18(土) 15:42:53
>>394 そうとも限らんぞ。ヌルポインタ定数とだけおぼえておけばいい。
397デフォルトの名無しさん:2005/06/18(土) 15:49:23
>>396
そうとも限るんじゃないのか

定数0はあらゆるポインタに代入可能であってnull pointerと解釈されるが、
それ以外に、キャストせずにあらゆるポインタに代入可能なものが
C++では存在しないだろ
398デフォルトの名無しさん:2005/06/18(土) 15:55:10
>>390
保証されない。普通の実装では巻き戻ししないで終端まで行ったままの筈。
399デフォルトの名無しさん:2005/06/18(土) 15:55:43
てんぷれーt(ry

NULLは意味論的にポインタなんだから、文法論でどうこう
いったってしかたないよ。'\0'もおなじ。
400デフォルトの名無しさん:2005/06/18(土) 16:02:27
ああそういえば0より安全なNULLの定義を模索して四苦八苦みたいな
ネタ昔読んだなあ
401デフォルトの名無しさん:2005/06/18(土) 17:07:35
template <typename T> operator T*() {return 0;}
こんなメンバを持つクラスにすればいい。
402デフォルトの名無しさん:2005/06/18(土) 17:36:32
C言語にはBASIC言語のrightやleft midと言ったような関数って
無いですが、みなさん自作されてるんでしょうか??
403デフォルトの名無しさん:2005/06/18(土) 17:42:24
>402
必要なら作る
404デフォルトの名無しさん:2005/06/18(土) 17:45:40
>>402
ないけどたいしたことはない。
sをchar配列やcharへのポインタだとするとLeftはs + nとするだけ、(書き換えされては困るならコピーを作ってから)
Rightもstrncpyでなんとかなる。組み合わせればMidもできる。

C++ならstd::basic_stringにいろいろとある。
405デフォルトの名無しさん:2005/06/18(土) 17:48:31
>>402
MFCのCStringにはそういうインタフェースがあるけどな

Cには文字列という型はないし
ポインタ操作や'\0'の挿入で代わりになるので
わざわざ関数作るまでもない、かな
406デフォルトの名無しさん:2005/06/18(土) 18:13:02
すみませんが質問です、
テキストを読んでいるとcurses.hとunistd.hをincludeする必要が出て来たのですが
BCCにはそのようなライブラリは無いのです
同じ書式で同じ効果を期待出来る様な、そんな都合の良いものは無いのでしょうか?
407デフォルトの名無しさん:2005/06/18(土) 18:29:11
質問です。
double型の算術計算のオーバーフローを検出する方法ってあるでしょうか
例えば

double a = 1.79e307;
double b = 1.79e307;
double c = a + b;

これを実行するとcは0になります。例外とか出力されるとうれしいのですが・・・
コンパイラはC++Builder6です。
408デフォルトの名無しさん:2005/06/18(土) 18:32:31
>そんな都合の良いものは
cygwin+gcc入れろ
409デフォルトの名無しさん:2005/06/18(土) 21:35:26
>>407
x86例外
普通は無限大になると思うんだけどなぁ…
410デフォルトの名無しさん:2005/06/18(土) 22:02:34
_controlfp(_EM_OVERFLOW, _MCW_EM);
411デフォルトの名無しさん:2005/06/18(土) 22:04:43
プログラマー板に書いたが放置されそうなので
マルチしますがスマソ。

マイコン組み込み系のソフト組んでて
こういう感じのテーブルジャンプのPGを組んだ。
void (*const rom_KansuuTable[10])(void) ={
test1,
test2,
test3,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};

void (*test_pointer)(BYTE *);
412デフォルトの名無しさん:2005/06/18(土) 22:05:00
続き
Loop1 = 0;
//関数アドレス読み出し
test_pointer = rom_KansuuTable[0];
//NULLがくるまで or 10個チェックするまで
while((test_pointer != NULL) && (Loop1 < 10)){
//関数実行
test_pointer(5);
//ループカウンタ更新
Loop1++;
//次の関数アドレス読み出し
test_pointer = rom_KansuuTable[Loop1];
}
 特にコンパイルエラー/ワーニングがでるわけはないし,動作もちゃんとするんだけど
 MISRAチェックをかけると
void (*test_pointer)(BYTE *);
^
--------------.c(---) ++ WARNING ++: <=4=(3672) constではない関数へのポインタを使用しています。Misra Rule 104
って怒られる。

ただ単純にtest_pointerを使わずにrom_KansuuTable[Loop1]を直接書きゃ解決なんだけど
ROM容量食うしね。
今は動作もちゃんとしてるんで,放置プレイしてるんだけど,なんか気持ち悪いので
解決方法があれば教えてください。
413デフォルトの名無しさん:2005/06/18(土) 22:11:27
MISRAチェックしなきゃいいじゃんw
414デフォルトの名無しさん:2005/06/18(土) 22:32:47
>>413
でもMISRAチェックしなきゃ出荷審査通らないんだよ。
CMMもやってるから品質にはやかましくて。
とりあえず問題なしとして今までは通しておるが,できるなら消したいと思い
415デフォルトの名無しさん:2005/06/18(土) 23:06:27
よくわかんないんだけど
関数の型が違くね?
416411ではない:2005/06/18(土) 23:30:55
>>415
void (*const test_pointer)(void);
ってこと?

しかし関数ポインタってよくわからんなぁ。
こっちの方が直感的でいいと思うが。
void test_pointer(void)* const;
417デフォルトの名無しさん:2005/06/18(土) 23:42:44
まずはその関数の引数をvoidなんだかBYTE*なんだかはっきりしろよ
ジャンプテーブルの宣言では引数はvoidだと言ってて
test_pointerの宣言では引数はBYTE*だと言ってるじゃねーか

しかし
test_pointer(5);
という呼び出しを見ると、実はintだという落ちじゃねーだろうな

あと、Cでは面倒なら関数ポインタの仮引数リストを宣言しないという手もある
C++と互換性が無いコードになるしお勧めはできんがな
418デフォルトの名無しさん:2005/06/18(土) 23:52:16
単にテーブルの「const」の位置が間違ってるだけじゃないのか?
419デフォルトの名無しさん:2005/06/18(土) 23:55:13
>>411
rom_KansuuTable と test_pointer の型が違う。
関数ポインタが、まだ理解できないなら、
とりあえず、typedef して共通の型になるようにしとけ。
420デフォルトの名無しさん:2005/06/19(日) 00:31:07
最近C++も飽きてきたんでC++を補完するような良い言語って無いですか?
421デフォルトの名無しさん:2005/06/19(日) 00:31:55
>>420
C#でもDでも何でもどうぞ。補完しているかどうかは別にして。
422デフォルトの名無しさん:2005/06/19(日) 00:53:45
>>420
間違いなくC#
設計思想は素晴らしいがdirtyな文法も許容される
良い意味でC++らしさを残した言語です
423デフォルトの名無しさん:2005/06/19(日) 01:13:06
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char a;
    do {
        printf("何か入力して下さい\n");
        scanf("%d", &a);
        printf("a = %d\n\n", a);
        if(a == -40)
           exit(-1);
    } while(a != '67');

    return 0;
}

最近C言語を始めたのですが、どうもわからないことがあります。
このプログラムなんですが、aに文字を入れると値が-40になります。
AだろうがQだろうがUだろうが-40になってしまいます。
それだけならいいのですが、aに-40が入ったらループを抜けるようにしないと
scanfを無視してループしてしまいます。
これはなんなのでしょうか…。
424423:2005/06/19(日) 01:13:55
環境はWindowsXp
コンパイラはVC6++についてきたものです。
425デフォルトの名無しさん:2005/06/19(日) 01:14:49
char a;
426デフォルトの名無しさん:2005/06/19(日) 01:16:11
'67'もわろた
427デフォルトの名無しさん:2005/06/19(日) 01:16:31
scanf("%c", &a)
printf("a = %c\n\n", a)
428デフォルトの名無しさん:2005/06/19(日) 01:20:37
最近VC6++が流行っているのですか?
429デフォルトの名無しさん:2005/06/19(日) 01:22:03
VC6++ の検索結果のうち 日本語のページ 約 73 件中 1 - 20 件目 (0.29 秒)
430デフォルトの名無しさん:2005/06/19(日) 01:27:20
>423
scanf("%d", &a);
の前にも
printf("a = %d\n", a);
を入れてみるといいよ。

あと、scanfは(printfもだけど)int型の関数だから
なにか値を返すらしいよ。
431デフォルトの名無しさん:2005/06/19(日) 01:46:24
printf("%d:",'67');
printf("%d\n",67);
printf("%c:",'67');
printf("%c\n",67);

困ったときはdebug write
432423:2005/06/19(日) 02:06:04
>>430
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char a, b;
    do {
        printf("a = %d, b = %d\n", a, b);
        printf("何か入力して下さい\n");
        printf("scanfの戻り値 %d\n", scanf("%c %c", &a, &b));
        printf("a = %d, b = %d\n\n", a, b);
    } while(a != 69);

    return 0;
}
実際にprintfを入れて試してみたらよくわかりました。
代入されなかったら0が返るんですね。
ヘルプを見てみると、戻り値の数だけ引数が増えるというのでやってみました。
aとbに両方正しい値が入ると引数が2になります。

恐らくscanfに値が入らないとラインバッファに値が残っているため
その値をを入れようとしても入らないためにまた残るので
永久ループになっていたのだと思います。

>>431
その67というのは69を入れようとして間違ったんですよ。
最初は'E'で比較していたのですが、Eのアスキーコードをいれてやれば
代用できるんじゃないかなと試してみました。
そのときにシングルクォーテーションをとり忘れてるんです。
433デフォルトの名無しさん:2005/06/19(日) 02:08:36
'E'の方がいいだろ
434423:2005/06/19(日) 02:17:36
>>433
やっぱりそうですか。
でも、書き方はいろいろ覚えておいたほうが損は無いかなと思ったんです。
435デフォルトの名無しさん:2005/06/19(日) 02:28:23
>>434
コンパイル後には同じになるんだから、
人間が見て見やすい方にしろ。
436423:2005/06/19(日) 02:33:44
>>435
よく考えたら誰が見てもわかりやすいものが一番いいですね…。
そうすることにします
437デフォルトの名無しさん:2005/06/19(日) 02:52:54
const int val = 5
class CA {
char hoge[val];
};
こうした場合、::val にしろと言われたのですが、これは
信じていいのですか?

この x 。 ::x にしろと、いつか言われたのですが、
これは洒落でしょうか?
438デフォルトの名無しさん:2005/06/19(日) 02:53:43
しまった(;´Д‘) 下の二行は無視してください。
439デフォルトの名無しさん:2005/06/19(日) 02:54:02
>>438
だが、断る!
440デフォルトの名無しさん:2005/06/19(日) 03:01:58
>>437
「::」が何を意味するのか考えれば自明だろ?
漏れはWin32API呼ぶときとかは必ず付けてるけどな
441デフォルトの名無しさん:2005/06/19(日) 03:09:14
const が定数を意味するんだから付ける必要もないかなぁとか思ってたんですが、
ここにいる人に聞くと、なんか説得力あるんだよな・・・
>>440
ありがとうございました。付けた方が良さそうですね。
442デフォルトの名無しさん:2005/06/19(日) 03:13:29
>>441
ネームスペースでググレ
443デフォルトの名無しさん:2005/06/19(日) 03:40:01
> const が定数を意味するんだから付ける必要もないかなぁとか思ってたんですが
激しく勘違いしてる余寒
444デフォルトの名無しさん:2005/06/19(日) 03:53:31
>>441
おーいー
>「::」が何を意味するのか
を激しく勘違いしとるぞ

答えだけ言うと、例題を見る限りはいらない
ていうかグローバルネームスペースに
valなんて汎用的な名前を漏らすなよ
class CA { static const int MAX_VAL = 5; (ry とかにしとけ
445デフォルトの名無しさん:2005/06/19(日) 04:07:08
>>437
洒落じゃ無くてお洒落なのです。
446411:2005/06/19(日) 11:21:35
>>415
>>416
>>417
>>419
すまん。例としてその場で書いたので間違いがあったようです。

なので
void (*test_pointer)(BYTE *); はvoid (*test_pointer)(unsigned char *);
void (*const rom_KansuuTable[10])(void) をvoid (*const rom_KansuuTable[10])(unsigned char)
test_pointer(5);をtest_pointer((unsigned char)5);
と読み替えてください。

というわけでどうすべきか皆さんの意見聞かせてください。



447デフォルトの名無しさん:2005/06/19(日) 11:30:28
それでもunsigned char *へのポインタを引数にする関数にunsigned charを引数として渡していることになるわけだが。

それはさておき、こうしたらだめ?
for (Loop1 = 0; (test_pointer != NULL) && (Loop1 < 10); Loop1++) {
  void (*const test_pointer)(BYTE *) = rom_KansuuTable[Loop1];
  test_pointer(5);
}
448デフォルトの名無しさん:2005/06/19(日) 12:03:55
>>446
> void (*test_pointer)(unsigned char *);
> void (*const rom_KansuuTable[10])(unsigned char)

どっちにしろ型が違う。
型が違うという事は、
環境によってはサイズが変わるから、必ず同じ型に汁。
449447:2005/06/19(日) 12:07:58
いまさらながら気付いた。
> unsigned char *へのポインタ
○| ̄|_
450デフォルトの名無しさん:2005/06/19(日) 12:10:40
>>411-412
の例で、test_pointerを使う必要性が感じられない。
って言うか、警告すら出ないのが不思議なくらいだ。

for( i=0; i<sizeof(rom_KansuuTable)/sizeof(*rom_KansuuTable) && rom_KansuuTable[i]; i++ )
{
  /* 関数テーブル呼び出し */
  rom_KansuuTable[i]( 5 );
}

で、いいんジャマイカ。
451デフォルトの名無しさん:2005/06/19(日) 12:24:42
>>447
test_pointer の代入前に比較しちゃアカン。
452Hoge1、Hoge2は適当に補間してくれ:2005/06/19(日) 12:29:17
>>411-412
やりたい事は、こんな感じか?

#include <stdio.h>

/* 関数ポインタ型定義 */
typedef void (*FunctionPtr)( int hoge );
/* 関数プロトタイプ */
void Hoge1( int hoge );
void Hoge2( int hoge );
/* 関数テーブル定義 */
const FunctionPtr FncTable[] =
{
   Hoge1  /* 関数 1 */
  ,Hoge2  /* 関数 2 */
  ,NULL   /* ストッパー */
};
/* main() */
int main( void )
{
  int i;

  for( i=0; FncTable[i]; i++ )  /* ストッパーが来るまでループ */
  {
    /* 関数テーブルから呼び出し */
    (FncTable[i])( i );
  }
  return 0;
}
453おしえて:2005/06/19(日) 13:24:46
雑誌の付録についてくるサンプルコードには、
たまにcppでかかれてて分割ファイルになってたりするのがありますよね。
あれはVC++ではどうやってコンパイルしたらいいのですか。
プロジェクトファイルとかワークスペースみたいなものがついてなくて、
どれからコンパイルすればいいのかわからないし。どうやってリンクしたら
いいのかも実はわかりません。
makefileがついてたのでbccでやってみたんですがエラーになります。
たぶんbcc用のじゃなくてgccとかのmakefileのようです。
どうすればいいの??
454デフォルトの名無しさん:2005/06/19(日) 13:28:46
>>453 cygwin でも使えばいいんじゃないかな。
455デフォルトの名無しさん:2005/06/19(日) 13:34:10
>>453
VCならとりあえず新しいプロジェクトを作り、
プロジェクトのフォルダの中に元と同名のcppファイルやh/hppファイルなどを作り、
それぞれ元のファイルから内容をコピーするってのはどうだ?
456デフォルトの名無しさん:2005/06/19(日) 13:39:04
>>455
そんな無駄な努力せんでも既存ファイルをプロジェクトに追加するのは可能だが。
まぁ、単純にコンパイルすればいいだけなら*.c/*.cppファイルだけ全部プロジェクトにつっこんでビルドすれば大体いける
457デフォルトの名無しさん:2005/06/19(日) 14:02:04
カレントディレクトリにexample.txt、change_txtというファイルが置いてあって

main{

char *filename = "example.txt";

printf("%d\n",remove(filename));
printf("%d\n",rename("change.txt",filename));

}

と入力すると、その出力が両方とも-1(remove,renameともに失敗)となります。
なにか原因として考えられることはあるでしょうか?
458457:2005/06/19(日) 14:05:39
訂正です
×カレントディレクトリにexample.txt,change_txt
○カレントディレクトリにexample,txt,change.txt
459デフォルトの名無しさん:2005/06/19(日) 14:05:52
まずmainがおかしい。
460デフォルトの名無しさん:2005/06/19(日) 14:15:11
>>457 perror() してみろ。
461& ◆hJb7GWrzxo :2005/06/19(日) 14:29:39
ttp://akita-nct.jp/~yamamoto/comp/OpenGL/OpenGL.html
たとえばこのソースコードをコンパイルするときにはどうすればいいんですか。
DOS窓でmakeとかやってもうまくできないんだけど・・・
やりかたがチガウ??
462デフォルトの名無しさん:2005/06/19(日) 14:42:16
>>461
「うまくできない」じゃわからん。エラーメッセージかなんか貼れよ。
463デフォルトの名無しさん:2005/06/19(日) 14:56:14
まあmakeが入ってないんだろう
464457:2005/06/19(日) 14:57:11
>>460
なるほど、perrorという関数でエラーの種類がわかるのですね。
そこで使ってみたところ、「Permission denined」というエラーが出ました。
英語を調べてみたところ「許可が否定された」ということらしいのですが原因がわかりません。
一応カレントディレクトリのファイルを調べてみたところ、
読み取り専用の項目にチェックはついていませんでした。
465デフォルトの名無しさん:2005/06/19(日) 14:59:48
>>464
カレントディレクトリのWritePermissionを調べよ。
あー、WinNT系か。それなら「読取専用」だけでなく「セキュリティ」タブも調べよ。
466おしえて:2005/06/19(日) 15:10:48

CFLAGS = -DWIN32
LIBS = -lglut32 -lglu32 -lopengl32 -lm

SRC = main.o diff.o meshdraw.o gl_screenshot.o


a.exe: $(SRC)
g++ -o $@ $(SRC) $(CFLAGS) $(LIBS)

.cpp.o:
g++ -c $<

こういうmakefileがはいってるんだけど、コレってDOS窓でmakeできないよね??
つーかmake a.exeって実行方法が間違いじゃねーよね??
467デフォルトの名無しさん:2005/06/19(日) 15:12:46
>>466
なんでできないと思ったの?エラーが出るならエラーメッセージ貼れよ。
468& ◆hJb7GWrzxo :2005/06/19(日) 15:14:10
g++なんかねーよとエラーがでるんだけど
469デフォルトの名無しさん:2005/06/19(日) 15:16:19
>>466
そのmakefileなら、普通はmakeに引き数は要らない。
470デフォルトの名無しさん:2005/06/19(日) 15:16:58
>>468
アホかい。cygwinでもインストールしてcygwin上でmakeせい。
#gccにチェックを入れるのを忘れずに。
471デフォルトの名無しさん:2005/06/19(日) 15:17:22
>>468
だったら g++ が無いのが原因。
DOS窓のせいでも make のせいでもない。
実行方法は間違いじゃない。
472デフォルトの名無しさん:2005/06/19(日) 15:20:41
すみません、プリプロセッサディレクティブ?で↓ってどんな条件なんでしょうか?

#if 0
#endif
473デフォルトの名無しさん:2005/06/19(日) 15:23:13
>>472
「この間はコンパイルしない」
コメントアウトの強力版としてよく使われる。
474デフォルトの名無しさん:2005/06/19(日) 15:26:06
>>473
あーそうなんですか、即レスありがとうございます

レスで気になったので再度すみませんが質問を…
コメントアウトで十分な気がするんですが、どんな時に使うのでしょう?
475デフォルトの名無しさん:2005/06/19(日) 15:30:33
>474
利点としては
・#if 1 にすればすぐに復活可能
・ネストできる
476おしえて:2005/06/19(日) 15:31:22
g++のところをbcc32に変えてDOS窓でコンパイルしようと思ったんだけど
それって無理なんすか
477デフォルトの名無しさん:2005/06/19(日) 15:33:21
>>475
お〜分かりました

ありがとうございましたー
478デフォルトの名無しさん:2005/06/19(日) 15:34:11
>>476
有理
479デフォルトの名無しさん:2005/06/19(日) 15:35:43
>>476
学習能力無いのか?
なんで無理だと思ったの?エラーが出るならエラーメッセージ貼れよ。
480デフォルトの名無しさん:2005/06/19(日) 15:37:09
>>474
/*
  /* */
*/
これだと2行目でコメント終わり。3行目でエラー。気をつけろ。
481デフォルトの名無しさん:2005/06/19(日) 15:59:23
ソースファイルから、特定のパターンを持つ(引数のタイプとか戻り値とか)関数を
抽出するコマンドラインツールはないでしょうか。

% listfunc "void *(int,int)" sample.c
void func1(int a, int b)
void func2(int a, int b)

といったイメージです。
482デフォルトの名無しさん:2005/06/19(日) 16:03:13
grep
483481:2005/06/19(日) 16:23:34
実際には関数名だけ取得できればよいので
grep+sedでがんばってみたのですが
改行があったり#ifdefがあったり、なかなかやっかいなので
既存のツールがあればと思って質問させてもらいました。
484デフォルトの名無しさん:2005/06/19(日) 16:25:12
>>483
タグファイルって(略
485デフォルトの名無しさん:2005/06/19(日) 16:27:01
C言語で通信をするプログラムを作っています
受信したデータbufferをパラメータとそれ以外のデータに分けたいんですが
パラメータ以外の項目数やデータ型や長さなどが明確でないので
sscanfが使えないんですが どうすればあっさりできるでしょうか?
buffer・・・12345 hoge 123 aaa...
パラメータ・・・12345 それ以外のデータ hoge 123 aaa...
486481:2005/06/19(日) 16:31:28
>>484
ctagsコマンドの出力のtagsファイルをgrepなどすれば望みがかないそうです。
ありがとうございました
487デフォルトの名無しさん:2005/06/19(日) 16:36:19
>>485
スペース区切りならスペースまで読み出せばいいんじゃないの?
488デフォルトの名無しさん:2005/06/19(日) 16:36:39
>>486
む、分かってるじゃないかい。
489デフォルトの名無しさん:2005/06/19(日) 17:03:42
C言語プログラムをmakefileでコンパイルしたら
警告: `関数' は前方で暗黙的に `int' を返すと宣言されました
という警告がでました。
この関数はdouble型を返すように宣言しています。
勝手にintで返すためプログラムがうまく動作しません
警告はなぜ発生するのですか?
490デフォルトの名無しさん:2005/06/19(日) 17:04:43
つ[プロトタイプ宣言]
491485:2005/06/19(日) 17:27:04
>>487サン スペースまで読み出すってどうすればいいんでしょうか?
sscanf(buffer,"%d %s",param,soreigai);ってするとsoreigaiにはhogeしかはいらないんですが
492デフォルトの名無しさん:2005/06/19(日) 17:30:41
>>491
%[]
493489:2005/06/19(日) 17:32:00
プロトタイプ宣言しようとしたら
conflicting types for `関数'
previous declaration of `関数'
というエラーがでてコンパイルできませんでした。
(たぶん宣言の仕方は間違ってないと思うけど・・・)
というよりプロトタイプ宣言しなくても関数は使えますよね?
494デフォルトの名無しさん:2005/06/19(日) 17:32:48
>>493
手前に同じ名前の関数が宣言されていて、その内容と食い違っている。
495489:2005/06/19(日) 17:42:56
#include<stdio.h>
#include<math.h>
#define Th 30.0
int check[1000][1000];
char *sep(char,int,int,int,int,int,int,int);
main()
{
}
unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,
int k,int nx,int ny)
{
}

こんな感じですけど間違いはありますか?
この他にもう1つ関数がありますが同様に宣言しており
同じ名前の関数は宣言されてません。
496485:2005/06/19(日) 17:44:13
sscanf(buffer,"%d % ",param,soreigai);ってするとsoreigaiには何も入らず
sscanf(buffer,"%d %[]",param,soreigai);ってすると実行エラーになるんですが
497デフォルトの名無しさん:2005/06/19(日) 17:45:16
> char *sep(char,int,int,int,int,int,int,int);
> unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY, int k,int nx,int ny)

宣言と定義でちがっとる。
498デフォルトの名無しさん:2005/06/19(日) 17:53:37
すみません、あるところで見かけたソースなのですが、
簡潔に書くとこんな感じ。

template <typename _T, int _X>
class Test {
public:
Test( _T hoge ) : len(_X) {};
protected:
const int len;
};

main()
{ Test<int, 2>;}

Test( _T hoge ) の : 以降の部分が何を意味するのかわかりません。
const int のキャストと同じ意味でしょうか?
499489:2005/06/19(日) 17:55:27
unsigned char *sep(unsigned char,int,int,int,int,int,int,int);
unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,int k,int nx,int ny)
ということでしょうか?
他にも考えられる宣言をしているのですがエラーがでます。
下の行が実際の関数なのでそれに合う正しいプロトタイプ宣言
はどうなるのでしょう?
500デフォルトの名無しさん:2005/06/19(日) 17:57:53
(´ー`)っ unsigned char *sep(unsigned char *,int,int,int,int,int,int,int);
501489:2005/06/19(日) 18:06:20
エラーもなくなり動作するようにはなりましたが
依然と実行結果は変わらず、原因は他にあるのだとわかりました。
勉強になりました。ありがとうございました。
502デフォルトの名無しさん:2005/06/19(日) 18:09:34
>>498
メンバ変数lenを_Xで初期化している。
503デフォルトの名無しさん:2005/06/19(日) 18:12:42
>>502
ありがとうございます
504デフォルトの名無しさん:2005/06/19(日) 18:13:28
というか、宣言は定義からそのままコピーしてもいい気がするが。
unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,int k,int nx,int ny);
505デフォルトの名無しさん:2005/06/19(日) 18:35:30
>>498
質問とは関係ないが、アンスコ始まりの名前使うな。
506デフォルトの名無しさん:2005/06/19(日) 18:38:34
>>485
その受信データに改行コードがないことが判っているなら、
%[^\n]
#つーか、少しは検索してみろよ。
507485:2005/06/19(日) 19:22:21
先頭の文字から指定文字数取ってくる関数はある(strcpy)のに
指定した文字数目から末尾まで取ってくるっていう関数がほしかったのです
ありがとうございます 何とかなりました
508& ◆QWv3R1XL8M :2005/06/19(日) 19:27:20
エラー E2209 main.cpp 5: インクルードファイル 'GL/glut.h' をオープンできない
エラー E2303 meshdraw.h 17: 型名が必要
エラー E2139 meshdraw.h 17: 宣言に ; がない
エラー E2303 meshdraw.h 18: 型名が必要
エラー E2238 meshdraw.h 18: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 17: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 18: 宣言に ; がない
エラー E2303 meshdraw.h 19: 型名が必要
エラー E2238 meshdraw.h 19: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 18: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 19: 宣言に ; がない
エラー E2303 meshdraw.h 20: 型名が必要
エラー E2238 meshdraw.h 20: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 19: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 20: 宣言に ; がない
エラー E2303 meshdraw.h 23: 型名が必要
エラー E2139 meshdraw.h 23: 宣言に ; がない
エラー E2303 meshdraw.h 24: 型名が必要
エラー E2238 meshdraw.h 24: 'LightStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 23: 一つ前の 'LightStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 24: 宣言に ; がない
エラー E2303 meshdraw.h 25: 型名が必要
エラー E2238 meshdraw.h 25: 'LightStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 24: 一つ前の 'LightStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 25: 宣言に ; がない
エラー E2228 meshdraw.h 25: エラーあるいは警告が多すぎる
*** 26 errors in Compile ***

** error 1 ** deleting main.o
>>479
g++をbcc32に書き換えてもこんなエラーがでるので無理なんかなとおもったんですが。
509デフォルトの名無しさん:2005/06/19(日) 19:35:33
>>507
sをchar配列やcharへのポインタとしたらs + nでn番目の文字数目からの文字列を表せる。それをstrcpyでもすればいい。
510デフォルトの名無しさん:2005/06/19(日) 19:42:55
>>508
学習能力無いのか?
'GL/glut.h' をインクルードできないのが問題だろ。
bcc32 のせいでもDOS窓のせいでもない。
511508:2005/06/19(日) 20:06:05
>510

bcc32用にglutをセットアップしてmakeしてみた。
するとこんなエラーがひとつ出た。

エラー E2337 c:\Borland\Bcc55\include\stdlib.h 584: オーバーロード関数群の中の 1 つだけしか "C" にできない

どういう意味だよオイ。
検索しても出ねえ。
512デフォルトの名無しさん:2005/06/19(日) 20:20:00
>>511
は?日本語は苦手ですか?
513デフォルトの名無しさん:2005/06/19(日) 20:21:51
>>511
extern "C" として宣言される関数は、関数名だけで一意に判別できないといけないので、
引数の型によるオーバーロードができない。

stdlib.h の 584行目で宣言されてる関数と
同じ名前の関数が無いか調べてみるといい。
514デフォルトの名無しさん:2005/06/19(日) 20:23:38
>>512
いや、これはエラーメッセージを手がかりにするのは厳しいだろう。
せめて extern "C" と書いてあればなんとかなるだろうが。
515デフォルトの名無しさん:2005/06/19(日) 20:26:02
>>514
そうですか。人によるのかなぁ。
516デフォルトの名無しさん:2005/06/19(日) 20:30:32
まあテンプレート使ってると意味不明なエラーメッセージなんぞ
日常茶飯だからな
517デフォルトの名無しさん:2005/06/19(日) 20:32:55
だからテンプレートって嫌いです><
518デフォルトの名無しさん:2005/06/19(日) 20:34:07
つーか>>511は質問しているのか?

それともチラシの裏なのか?
519508:2005/06/19(日) 20:43:07
extern "C"ってのはC++からCの関数を呼び出すときの規約なんですか。
学習能力がないので知りませんでした。
つーかstdlib.hの584行目は
using std::exit;
だったんですが、これが一体どうだっていうんですか?おしえてください
520デフォルトの名無しさん:2005/06/19(日) 20:44:44
>>519
他にグローバルでexit()っていう関数がない?
521デフォルトの名無しさん:2005/06/19(日) 20:47:36
glut.hにあるな。削ってみれ。
522508:2005/06/19(日) 20:50:41
glut.hを書き換えたりして、いいんですか?????????????????
523デフォルトの名無しさん:2005/06/19(日) 20:54:01
これだけキーワードが揃えばもう十分だろう。
ttp://www.google.co.jp/search?q=glut+exit+extern+%22C%22
524デフォルトの名無しさん:2005/06/19(日) 20:54:19
あ?俺なんかvmunixとかntoskrnl.exeとか書き換えるよ?
ゴクヒで

ヘッダなんざただのテキストファイルなんだから、viでチョイチョイだろ
ゴクヒで
525デフォルトの名無しさん:2005/06/19(日) 20:57:08
>>522
藻前はコンパイルしたいのかしたくないのかどっちなんだ?
526デフォルトの名無しさん:2005/06/19(日) 20:58:53
>>522
そうだよな。そのまま何度もコンパイルしてたほうがいいよなw
527デフォルトの名無しさん:2005/06/19(日) 21:09:00
英文字の大小比較ってどうすんですかね?
たとえばa,dという文字ならa<dっていう感じにしたいんですが。
528デフォルトの名無しさん:2005/06/19(日) 21:10:45
>>527
asciiならそのまま'a' < 'd'で。
529508:2005/06/19(日) 21:17:05
エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 486: 未定義のシンボル exit(関数 __stdcall glutInit_ATEXIT_HACK(int *,char * *) )
エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 503: 未定義のシンボル exit(関数 __stdcall glutCreateWindow_ATEXIT_HACK(const char *) )
エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 549: 未定義のシンボル exit(関数 __stdcall glutCreateMenu_ATEXIT_HACK(void (*)(int)) )

コメント化したexitが未定義のシンボルになってエラーでます。
上の三行もコメント化してみたんですが、すると

エラー E2268 meshdraw.cpp 41: 未定義の関数 'glutInit_ATEXIT_HACK' を呼び出した(関数 MeshDraw::init(int,char * *,Solver *) )
エラー E2268 meshdraw.cpp 45: 未定義の関数 'glutCreateWindow_ATEXIT_HACK' を呼び出した(関数 MeshDraw::init(int,char * *,Solver *) )

こうなりました。
やっぱglut.hのexit使ってるみたいなんだけど・・・これって解決困難?
530デフォルトの名無しさん:2005/06/19(日) 21:22:39
>>529
んじゃ、glut.hでinclude <stdlib.h>とか。
531デフォルトの名無しさん:2005/06/19(日) 21:24:19
>>529
exit の宣言が要るんなら、削除じゃなくて #include <stdlib.h> に置き換えればいいんじゃね?
532508:2005/06/19(日) 21:28:49
みなさん、どうしてそんなに頭がいいんですか
533デフォルトの名無しさん:2005/06/19(日) 21:30:40
>>532 経験値が違う。
534デフォルトの名無しさん:2005/06/19(日) 21:33:48
523の4件目のhttp://www.alab.t.u-tokyo.ac.jp/~star/bccinst.htmlにこうある
>glut.h の 146 行目「extern _CRTIMP void __cdecl exit(int);」をコメントアウト ( 頭に // をつける ) 。
> 使うときは、glut.h より前に stdlib.h か windows.h を include します
535デフォルトの名無しさん:2005/06/19(日) 21:37:55
Linuxのプログラムについてお聞きしてもいいですか?
ちょっとしたネットワークプログラムを作っています。
SIGCHLDをキャッチしてその中からログファイルへの書き出し
をしているのですが、localtimeを呼び出しているところで
ブロックしてしまいます。
デバッグのためにElectricFenceをリンクしているのですが
それを外せばブロックしません。
解決方法などはあるのでしょうか?
または何かおかしいことをやっているのでしょうか?
なお、VineLinux3.1 FTP版
gcc-3.3.2-0vl8
kernel-2.4.31
ElectricFence-2.2.2-11vl2
です。
VineLinuxの公式kernelの、kernel-2.4.27-0vl7.3でも同じ問題が発生しました。
なお、同じ問題が再現するソースを次に示します。
536535:2005/06/19(日) 21:39:09
--- a.c ---
#include <stdio.h>
#include <signal.h>
#include <time.h>

void handler(int signo)
{
time_t t = time(NULL);
struct tm *tt = localtime(&t);
}

void setup_signal()
{
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_NOCLDSTOP | SA_RESTART;
sigaction(SIGCHLD, &act, NULL);
}

int main()
{
setup_signal();

if(fork() == 0) exit(0);
sleep(1);
return 0;
}

# gcc a.c -lefence
537508:2005/06/19(日) 21:45:00
みなさんどうもありがとうございます。
で、その類のエラーは消えたんですがa.exeが見つからないというエラーがでるようになりました。
makefileはこう書き換えてあるんですが


CFLAGS = -DWIN32
LIBS = -lglut32 -lglu32 -lopengl32 -lm

SRC = main.obj diff.obj meshdraw.obj gl_screenshot.obj


a.exe: $(SRC)
bcc32 -o $@ $(SRC) $(CFLAGS) $(LIBS)

.cpp.o:
bcc32 -c $<

ところで、a.exeってなんすか。
a.outみたいなもんすか。
もしかしてcygwin用ですか。
DOS窓でbccでやるときにはa.exeは何か別の名前にすべきなんですか
538デフォルトの名無しさん:2005/06/19(日) 21:45:35
高校の宿題でゎからなぃプログラムのところが
ぁるんですけど、そーゆーのって
ここで聞いてもぃぃnですか??すぃませnooo
539デフォルトの名無しさん:2005/06/19(日) 21:46:53
>>538
C/C++の宿題を片付けます 45代目
http://pc8.2ch.net/test/read.cgi/tech/1118165596/l50
540デフォルトの名無しさん:2005/06/19(日) 21:47:04
コミュニケーション取れるようになってから出直してきてね
541デフォルトの名無しさん:2005/06/19(日) 22:01:38
COBOLなnでつがぁ・・・・・


――――――――――――――――――――――――
|      KURASU-TAB   |
 ――――――――――――――――――――――――
|SEITO(1)|SEITO(2)|SEITO(3)|〜〜|SEITO(40)|
 ――――――――――――――――――――――――
テーブルKURASU-TABのSEITO(1)に1を、(2)に2を・・・
SEITO(40)に40を初期値として空欄をうめなさぃ。

MOVE (ア)
PERFORM UNTIL (イ)
COMPUTE SOE = SOE + 1
MOVE (ウ) TO SEITO(SOE)
END-PERFORM
542デフォルトの名無しさん:2005/06/19(日) 22:03:45
ここはC/C++スレですが、何か?
543デフォルトの名無しさん:2005/06/19(日) 22:07:25
>>535
ElectricFenceとやらを知らないので、外してるかもだけど、
localtime の代わりに localtime_rを使ってもだめ?
544デフォルトの名無しさん:2005/06/19(日) 22:10:56
>537
おまいには学習能力がない。ひょっとしたら人並みの思考能力もないかもしれない。
このままプログラミングをやってもおまいも含めて周りの人間を不幸にしかしないと思われる。
よって、プログラミングをやめるか、さもなくば首吊って氏ね。

冥土の土産に答えとくと
bcc32 -o $@ $(SRC) $(CFLAGS) $(LIBS)

bcc32 -o$@ $(SRC) $(CFLAGS) $(LIBS)
に書き換えて make しろ。
545デフォルトの名無しさん:2005/06/19(日) 22:11:32
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/signal.2.html
というか、localtimeは「安全な関数」ではないみたいだけど。
546535:2005/06/19(日) 22:48:06
localtime_r でも駄目でした。
うーむ、localtime_rも「安全な関数」ではないですが
これが原因なんでしょうかね。
しかしどちらにしろ推奨されていない実装はよした方がいいですね。
別の方法も考えて見ます。
547デフォルトの名無しさん:2005/06/19(日) 23:11:03
>>546
最低限、以下の事に答えて頂けると、答える側としては助かります。
よろしくお願いします m(__)m

1. その「駄目」というのは、546と同じ症状、つまり「localtime_rでブロックして
しまう」という解釈でいいですか?

2. 「ブロックしてしまう」というのは関数が呼ばれたまま返ってこないという
解釈でいいですか?

3. 「ブロックしてしまう」というのは具体的にはどうやって確かめましたか?

4. ネットワークプログラムを作っているそうですが、そういう余計なものを
一旦取っぱらって、単にforkしてlocaltimeを呼ぶだけという短いプログラムでも
同じ状況が再現されますか?

5. timeの結果は正しいと確認できてますか? (どのように確認しましたか?)
548508:2005/06/19(日) 23:25:53
>544

書き換えてmakeした結果↓

Fatal: ファイル A.EXE が開けません

・・・駄目じゃん。思考力がないのはその通りなのでもっとヒントをくれよ
549デフォルトの名無しさん:2005/06/19(日) 23:27:28
>>548
はぁ?自分で実行したプログラムくらい管理せい!
550デフォルトの名無しさん:2005/06/19(日) 23:29:40
-o $@削ったら、main.exeができるんとちゃう?
たぶn別のリンカエラーがまたでてくる木がするけど
551デフォルトの名無しさん:2005/06/19(日) 23:31:02
うーん、こんなにアホなのにOpenGLかぁ
552デフォルトの名無しさん:2005/06/19(日) 23:34:52
>>548
独り言はチラシの裏にかけよ、なっ!
553デフォルトの名無しさん:2005/06/19(日) 23:36:53
class A
{
public:
void showX();
private:
A* x;
int v;
};

void A::showX()
{
std::cout << x->v << std::endl;
}

というコードをうっかり書いたらコンパイラ通っちゃったんですが
x->vでアクセス違反にならないんでしょうか?気になって夜も眠れません。
554デフォルトの名無しさん:2005/06/19(日) 23:38:24
>>548
それは回答者へのダメだしか?
555デフォルトの名無しさん:2005/06/19(日) 23:40:52
>>553
アクセス制御はインスタンス単位ではなくクラス単位に働くのですよ
556デフォルトの名無しさん:2005/06/19(日) 23:41:21
>>553
文法的に間違ってないし。

でもとりあえず解決してから寝たほうがいい。
557デフォルトの名無しさん:2005/06/19(日) 23:41:24
>>553
それは正常な動作。
showX が実行されるときに、xがちゃんと初期化されていれば
アクセス違反にはならない。
558デフォルトの名無しさん:2005/06/19(日) 23:41:58
>>593
未初期化のポインタを使ってるから未定義動作だろ。
559デフォルトの名無しさん:2005/06/19(日) 23:44:39
>>553
通らない理由がないからコンパイルは通るね。
例えばコンストラクタで適切に値をセットするならアクセス違反にもならないし。
そんなことで眠れなくなるくらいならプログラミングをやめた方がいいよ。
#寧ろデスマ要員として就職できたりしてw
560デフォルトの名無しさん:2005/06/19(日) 23:45:46
おーい、>593やー、未初期化のポインタを使ってるんだとよ〜

つーか、>558は預言者かい。
561535:2005/06/19(日) 23:47:59
>>547
1,2 はい、その通りです。
3 前後にprintfを挟んで確認しました。
また、プログラムが永久にハングします。
4.単にforkしてlocaltimeを呼ぶだけでは発生しません。
5. printf("%d\n", t); として確認しました。
562553:2005/06/19(日) 23:48:38
省略してますが初期化はしてます。
>>555
クラス単位なんですか。この場合アクセス制御することは出来ないんでしょうか?
563デフォルトの名無しさん:2005/06/19(日) 23:55:13
>>562
>省略してますが初期化はしてます。
w

アクセス制御とメモリの保護を一緒にしないでね。
564デフォルトの名無しさん:2005/06/19(日) 23:58:14
>>561
>>547ではないけどさ
1と4の答えのつじつまが合ってないように見えるんだが、気のせい?
565デフォルトの名無しさん:2005/06/19(日) 23:59:43
>>562
なんでしたいのか良くわからんけど
コンパイル時にアクセス制御したいなら無理かも
実行時ならthis と xを比較すればいいんじゃね?
566デフォルトの名無しさん:2005/06/20(月) 00:05:29
>>565
ありがとうございました。
567535:2005/06/20(月) 00:08:16
>>564
詳しい説明をお願いします。
568デフォルトの名無しさん:2005/06/20(月) 00:22:59
>>567
誤読ならすまんが
1ではlocaltime とか localtime_r でブロックしてしまう、と言っているように見える。
4ではlocaltimeだけなら大丈夫だった、と言っているように見える。
(聞きたいのは localtime (localtime_r) 自体でブロックしているのかいないのか)

とにかくブロックしてないコードにちょっとずつコードを追加していってみては?
569デフォルトの名無しさん:2005/06/20(月) 00:40:46
シグナルハンドラではあんまり処理させちゃイケナイから、
time()の結果をパイプに書いておしまいにするみたいにしたら。
パイプは、selectとかで待つとして。
570デフォルトの名無しさん:2005/06/20(月) 00:46:12
>>569
その、"あんまり"を説明してください
571535:2005/06/20(月) 00:53:37
>>567
あ、なるほど、そういうことでしたか。
私はforkだけで、signalを使わないプログラムでは発生しない
というつもりで書いてました。紛らわしい書き方をしてすみません。
572535:2005/06/20(月) 01:05:54
>>569
やはりそういう方法を取ろうと思います。
573デフォルトの名無しさん:2005/06/20(月) 02:30:08
    PUSH EBP        ;DATA_XOR_PROC
    MOV EBP,ESP
    SUB ESP,0C
    MOV EAX,[ARG.1]   ;buffer adrress
    MOV [LOCAL.1],EAX
    MOV EAX,[ARG.2]   ;buffer size
    CDQ
    AND EDX,3
    ADD EAX,EDX
    SAR EAX,2
    MOV [LOCAL.3],EAX
    MOV [LOCAL.2],0
    JMP SHORT b:
a:   MOV ECX,[LOCAL.2]
    ADD ECX,1
b:   MOV [LOCAL.2],ECX
    MOV EDX,[LOCAL.2]
    CMP EDX,[LOCAL.3]
    JGE SHORT z:
    MOV EAX,[LOCAL.2]
    MOV ECX,[LOCAL.1]
    MOV EDX,DS:[ECX+EAX*4]
    XOR EDX,12345678
    MOV EAX,[LOCAL.2]
    MOV ECX,[LOCAL.1]
    MOV DS:[ECX+EAX*4],EDX
    JMP SHORT a:
z:   MOV ESP,EBP
    POP EBP
    RETN
このように成る様Cで書いてるんですが上手くかけません。
574537:2005/06/20(月) 02:33:11
int DATA_XOR(int buffer, int bufsize){
int a = buffer;
int b = bufsize/4;
int i;

for (i=0;i < b;i++){
a = (a + (4 * i) ^DATXOR);
}
return 0;
}

これだとダメなわけですが、既にあるbefferを配列として扱えるのでしょうか?
575574:2005/06/20(月) 02:34:05
537ではなく573です。すみません。
576デフォルトの名無しさん:2005/06/20(月) 03:10:52
つint* buffer
577デフォルトの名無しさん:2005/06/20(月) 03:39:38
ありがとう>>576さん。
でもダメでした。

>>574ので XOR EDX,12345678 までは同じコードになるのですが、
以降違ってしまいます。 配列にしようとしたところ、4行目辺りから
違うものになってしまい、配列は関係ないようです。

a+i = (a + (4 * i) ^DATXOR); こんな感じのが許されるなら同じに
なりそうなのですが。
578デフォルトの名無しさん:2005/06/20(月) 03:50:00
つ int * a = buffer; a[i] = a[i ^ DATXOR];
579デフォルトの名無しさん:2005/06/20(月) 04:02:34
ありがとう>>578さん。
でも、付け加えるのか、置き換えるのか、解りません。
最初の定義だとしてチャレンジ中です。
580579:2005/06/20(月) 04:19:37
a+i = (a + (4 * i) ^DATXOR); これと置き換えると、かなり近いコードに
なりましたが、まだダメでした。
申し遅れましたが最近Cの勉強を始め、WisdomSoftのC言語入門、48.バイナリデータ
まで、解ったつもりの初心者でした。

581580:2005/06/20(月) 05:27:26
void DATA_XOR(int buffer, int bufsize){
int *a = buffer;
int i;
int b = bufsize/4;

for (i=0;i < b;i++) a[i] = a[i]^ DATXOR;
}

以上の様にしましたところ、同じになりました。

>>578さん、ありがとうございました。<(_ _)>
582デフォルトの名無しさん:2005/06/20(月) 12:34:54
windowsフォームアプリケーションでドラッグアンドドロップのやりかたが
わかりません。
だれか教えてください。
よろしくお願いします。
583デフォルトの名無しさん:2005/06/20(月) 13:08:30
>>582
.netスレ池
584デフォルトの名無しさん:2005/06/20(月) 13:10:51
誰か助けてください。C言語で鶴亀算(?)ってできるのでしょうか?一応linuxです…
585デフォルトの名無しさん:2005/06/20(月) 13:22:00
機械的な手順に落とせるのならできる
586デフォルトの名無しさん:2005/06/20(月) 14:18:54
>>584
#include <stdio.h>
#define MAX( a, b ) ( a < b ? b : a)
#define MIN( a, b ) ( a > b ? b : a)
/* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/
int get_head1(int feet1, int feet2, int all_head, int all_feet)
{
  if(feet1 < 1 || feet2 < 1) return -1;
  if( MIN(feet1, feet2) * all_head > all_feet ) return -1;
  if( MAX(feet1, feet2) * all_head < all_feet ) return -1;
  return ( all_feet - all_head * MIN(feet1, feet2) ) / MAX(feet1, feet2);
}

/* 脚の多い方の動物の頭数を返す (-1 == ERROR )*/
int get_head2(int feet1, int feet2, int all_head, int all_feet)
{
  int ans = get_head1(feet1, feet2, all_head, all_feet);
  if( ans != -1 ) ans = all_head - ans;
  return ans;
}

int main()
{
  int kame_feet = 4;
  int turu_feet = 2;
  int all_head = 10;
  int all_feet = 30;
  printf("turu = %d\n", get_head1(kame_feet, turu_feet, all_head, all_feet));
  printf("kame = %d\n", get_head2(kame_feet, turu_feet, all_head, all_feet));
  return 0;
}
587デフォルトの名無しさん:2005/06/20(月) 14:22:50
char str1[20] = "aaaaa\n";
char str2[20] = "bbbbbb\n";
char str3[20] = "ccc\n";
char tmp[20] = "";

上記のような変数を用意し、tmpにそれぞれをコピーしようとしています。
正確にはファイルから1行読み取り、改行手前までのデータをコピーするのですが。

このとき、strncpy(tmp,str1,strlen(str1)-1); と strncpy(tmp,str2,strlen(str2)-1); までは
正常に動作するのですが、
strncpy(tmp,str3,strlen(str3)-1); を実行するとうまくできません。

strncpy(tmp,str1,strlen(str1)-1); → tmp : aaaaa
strncpy(tmp,str2,strlen(str2)-1); → tmp : bbbbbb
strncpy(tmp,str3,strlen(str3)-1); → tmp : cccbbb

str3をコピーして、tmpにcccだけを格納したいのですが、
どのようにすればいいのでしょうか。
環境はWindows2000で、コンパイラはbccです。
588584:2005/06/20(月) 14:23:20
間違えた。

get_head1 が脚の多い方。
get_head2 が脚の少ない方。

です。
589デフォルトの名無しさん:2005/06/20(月) 14:24:47
スマン番号ミス。

>588 は、 584 ではなく、>586の訂正。
590デフォルトの名無しさん:2005/06/20(月) 14:27:10
すいません、自己解決しました・・・orz
591586:2005/06/20(月) 14:29:56
げ、計算あってない。スマン。
592582:2005/06/20(月) 14:44:15
>>583
無いスレに誘導されても困ります。
593デフォルトの名無しさん:2005/06/20(月) 14:53:40
>>592
検索も出来ない人にageられても困ります。
594582:2005/06/20(月) 14:56:09
>>583
だったらURL張ってみてください。
最後まで検索かけましたが何か?
595586:2005/06/20(月) 14:58:51
できた。以下の関数を訂正。

/* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/
int get_head1(int feet1, int feet2, int all_head, int all_feet)
{
int tmp;
if(feet1 < 1 || feet2 < 1) return -1;
if( MIN(feet1, feet2) * all_head > all_feet ) return -1;
if( MAX(feet1, feet2) * all_head < all_feet ) return -1;
tmp = all_head * MAX(feet1, feet2) - all_feet;
if( tmp % MIN(feet1, feet2) != 0 ) return -1;
return tmp / MIN(feet1, feet2);
}

なお、get_head1 が脚の少ないほう、get_head2 が多いほうです。
すれ汚しスマソ。
596582:2005/06/20(月) 16:08:19
>>583
結局みつからないのならはじめから煽らないでください。
597デフォルトの名無しさん:2005/06/20(月) 16:24:09
>>582
いいから消えろ
.NETが見つからん言うてVCスレとか探してみたんかてめぇは
598デフォルトの名無しさん:2005/06/20(月) 16:41:55
           ____________
          ||                ||
          ||    バカは放置!    ||
          ||          。  ΛΛ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ハーイ!     ||          \. (゚Д゚,,) <  >>597さん、いいですね!
          ||________⊂ ∪  \_______
  ∧ ∧    ∧ ∧    ∧ ∧      |  |
  (  ∧ ∧ (   ∧ ∧ (  ∧ ∧   UU~
〜(_(  ∧ ∧ __(  ∧ ∧__(    ∧ ∧    ハーイ!
  〜(_(  ∧ ∧_(  ∧ ∧_ (  ∧ ∧
    〜(_(   ,,)〜(_(   ,,)〜(_(   ,,)
      〜(___ノ  〜(___ノ   〜(___ノ
599デフォルトの名無しさん:2005/06/20(月) 17:15:29
char *a = mallocで作られたポインタ;
free(a);
としたら、*aを使うのは危険になりますが、aは大丈夫なのでしょうか?
つまりこのまま
a = 別のmallocで作られたポインタ;
等とするのは大丈夫なのでしょうか?
600582:2005/06/20(月) 17:15:45
>>597
だったらはなから.netスレ池とかかくなヴォケ
うまく誘導できないくらいならするなと言いたいだけだ。

まぁこんな糞なことしか議論できない低脳に聞いた俺が馬鹿だったって話なんだがな。
601デフォルトの名無しさん:2005/06/20(月) 17:17:43
freeの後で*aを使うのはもちろんだめだが
aを再利用するのは問題ない
602デフォルトの名無しさん:2005/06/20(月) 17:21:04
>>600
自分で馬鹿言ってりゃ世話無いぜw
603デフォルトの名無しさん:2005/06/20(月) 17:21:42
>>598
ジサクジエンカコワルイ
604デフォルトの名無しさん:2005/06/20(月) 17:23:50
>>599
OK。キミはちゃんと変数を理解している。
希に、delete a; すると、
「aが使えない」「aにNULLが入る」等と勘違いする人がいる。
605デフォルトの名無しさん:2005/06/20(月) 17:27:03
>>600
誘導して欲しいなら、まずはこっちに行け。

【 質問誘導スレ 】
http://pc8.2ch.net/test/read.cgi/tech/1066747198/l50
606デフォルトの名無しさん:2005/06/20(月) 17:29:23
>>599
aはただの入れ物であり、free(a)で解放されるのはaに入れていたアドレスの先にある領域
aにはなんら影響を及ぼさない

余談だが、free(a)したら直後にa=NULLにしておくことをオススメする
607デフォルトの名無しさん:2005/06/20(月) 17:56:38
ただ、変数の意味が変わるような使い方は好ましくないとされてるみたい。
608584:2005/06/20(月) 18:20:23
>>586ありがとうございます
ですが…
C言語で連立方程式を解くに
はそんなにかかるんですか…
もっと勉強しなきゃ…or-z
実は授業で出た課題なんですが
scanf関数とかしかやってない
のにこれはちょっと無茶では
609デフォルトの名無しさん:2005/06/20(月) 18:28:59
いや、これは連立方程式ではなく鶴亀算。
連立王定式なら、もっと煩雑になるだろうな。
610デフォルトの名無しさん:2005/06/20(月) 18:29:58
一次連立方程式なら、行列を使った解法がいくらでもあるんじゃない?
611 ◆CDoPhxVDCI :2005/06/20(月) 18:36:08 BE:76068926-#
printf("\x1b[2J") ができません。画面が消えません。
device=%SystemRoot%\system32\ANSI.SYS
を追加したんですができませんでした。
OSはXPでコンパイラはフリーのBCCを使っています。
612デフォルトの名無しさん:2005/06/20(月) 18:45:57
XPではだめなんじゃ?
command.comならいける
613デフォルトの名無しさん:2005/06/20(月) 18:51:28
そういうことではなく、32ビットコンソールアプリとNT系コンソールの組み合わせがNG.
XPのcommand.comから32ビットコンソールアプリを起動してもミリ。
614デフォルトの名無しさん:2005/06/20(月) 18:56:36
cygwin でもミリ?
615デフォルトの名無しさん:2005/06/20(月) 18:57:08
XPにcommand.comってあったっけ?
cmd.exeならあるんだが。

で、エスケープシーケンスで色つけたいなら端末エミュレータを使えばいい。
616デフォルトの名無しさん:2005/06/20(月) 18:59:39
617デフォルトの名無しさん:2005/06/20(月) 19:02:26
c:\windows\system32 のディレクトリ
2001/08/28 12:00 64,814 command.com
618デフォルトの名無しさん:2005/06/20(月) 19:03:25
>>608
連立一次方程式。整数解のみ版
#include <stdio.h>
int main()
{
  int a, b, c, d, e, f;
  int x, y;
  int v1, v2;
  printf(">> ax + by = c\n");
  printf(">> dx + ey = f\n");
  printf("input [ a b c ] > ");
  scanf("%d %d %d", &a, &b, &c);
  printf("input [ d e f ] > ");
  scanf("%d %d %d", &d, &e, &f);
  v1 = e * c - b * f;
  v2 = e * a - b * d;
  if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
  x = v1 / v2;
  v1 = c - a * x;
  v2 = b;
  if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
  y =  v1 / v2;
  printf("%dx + %dy = %d\n", a, b, d);
  printf("%dx + %dy = %d\n", d, e, f);
  printf("( x, y ) = ( %d, %d )\n", x, y);
  return 0;
}

鶴亀計算するなら。
input [ a, b c ] = [ 1, 1, 頭の合計]
input [ d e f ] = [ 2, 4, 脚の合計] で
( x, y ) = ( 鶴の数, 亀の数 ) と出ます。
619618:2005/06/20(月) 19:06:45
バグ訂正
下から5行目
誤> printf("%dx + %dy = %d\n", a, b, d);
正> printf("%dx + %dy = %d\n", a, b, c);
620デフォルトの名無しさん:2005/06/20(月) 19:42:56
初心者です。
関係演算子の説明で
"a < b aがbよりも小さければ1,そうでなければ0という値を生成する"
ってあるんですけど値って・・・。
単純に不等号だと思ってればいいんですよね?
621デフォルトの名無しさん:2005/06/20(月) 19:47:40
>>620
int a = 1, b = 2, c = a < b;
これでcに1が入るって事。
622デフォルトの名無しさん:2005/06/20(月) 19:59:03
>>620
それでもいいけど、0は偽・0以外は真ということを理解しといた方がいい。
623デフォルトの名無しさん:2005/06/20(月) 20:04:59
>>621
うぉ、ほんとだ
ちゃんと0か1出力しますね(;´Д`)
>>621さんありがとう
624デフォルトの名無しさん:2005/06/20(月) 20:06:02
>>620
つまりa < b < cなんてのが数学とは違う解釈になる。
625デフォルトの名無しさん:2005/06/20(月) 20:08:34
operator < ()
626デフォルトの名無しさん:2005/06/20(月) 20:10:23
0, '\0', NULL

これらは、条件式では偽となる。
それ以外はすべて真。

Cにはブーリアン型がないので、これらをブーリアン「偽」の代用と
し、集合論の原理からそれ以外のすべての値は真となる。

しかし、定数としての真を定義しなければ、実装上厄介なため、
無数にある真値の中から代表として1を使用している。
627620:2005/06/20(月) 20:21:07
>>622-626
なるほど、数学の不等号と違うんですか・・。φ(`д´)メモメモ...
それでプログラムを作ったんですがエラーが・・・もうちょっと考えます。

628デフォルトの名無しさん:2005/06/20(月) 20:25:42
Cの「式」は、数学の「式」と同じじゃないのサ
評価することができて、値が存在する何者か。

=は等式じゃなくて単に「代入する」んだし
代入式にも「式の値」が存在する。
629620:2005/06/20(月) 20:29:49

scanf("%d" , &n1);/*値を2つ取得*/
scanf("%d" , &n2);

n3 = n1 > n2; /*n3に値0,1のいずれかを取得させる*/
630620:2005/06/20(月) 20:31:13

n3 = n1 > n2; /*n3に値0,1のいずれかを取得させる*/

scanf("%d" , &n1);/*値を2つ取得*/
scanf("%d" , &n2);
としてたため、0しか吐いてくれませんでした(;´Д`)
629ので正確に0or1を吐いてくれます。皆さんありがとうございますた。
631608:2005/06/20(月) 20:43:48
あ、なるほど!!!
>>618さん、ありがとうございます!
ほんとに助かりました!!
ところでmainのまえのintは
必要なのですか?
632デフォルトの名無しさん:2005/06/20(月) 20:54:47
C99では必須。C++でも必須だったはず。それ以前のCではなくても問題ない。
間違ってもvoidなんて書くなよ。
633608:2005/06/20(月) 20:57:03
>>632
授業ではいきなりmain()...と書いていたのですが…
634デフォルトの名無しさん:2005/06/20(月) 21:00:15
>>633
main()と書くのはC89などではint main()とと書くの同義。
635デフォルトの名無しさん:2005/06/20(月) 21:33:06
とにかく int main って書いておけ。いきなり main はもうとっくに時代遅れだ
636608:2005/06/20(月) 21:34:33
わ、わかりますた…
637608:2005/06/20(月) 21:41:21
ところで、Microsoft Visual C++ Toolkit 2003って
どうやって使うんでしょうか…
なんか自分のPCでもコンパイルとかしてみよう
と思ってダウンロードしてみたのですが
コマンドとか良くわからないもので…
学校のlinuxならやり方は当然習っているのですが
ためしに画面にgccと打ち込んでみる…or-z
638デフォルトの名無しさん:2005/06/20(月) 21:49:11
639デフォルトの名無しさん:2005/06/20(月) 21:49:29
よくわからんがインストールした辺りから vcvars32.bat を探し出すと幸せになれるかもな。

640デフォルトの名無しさん:2005/06/20(月) 22:15:44
>637
いっそ cygwin 入れて gcc 使えば?
641デフォルトの名無しさん:2005/06/20(月) 22:17:34
しかし学校でやってるなら同級生の詳しい奴に聞いた方が早くないか?
642デフォルトの名無しさん:2005/06/20(月) 22:24:33
>>641
察してやれよ
643デフォルトの名無しさん:2005/06/20(月) 23:32:51
a.同級生が他にいない(1人だけである)
b.これでも自分が一番詳しい

う〜ん、その他は?

644デフォルトの名無しさん:2005/06/20(月) 23:36:53
typedef int(*VLCFUNC)(const char *aptr, int asiz, const char *bptr, int bsiz);
この様に型が定義されていて
VILLA *vlopen(const char *name, int omode, VLCFUNC cmp);
この様にその型の関数を使う関数のあるライブラリがあるのですが,
マニュアルによると上の定義で関数を書いてvlopenに指定しろ、との事なのですが
例えばどう書けば良いのでしょうか?
645デフォルトの名無しさん:2005/06/20(月) 23:36:55
c.特に理由は無いがなんとなく嫌
646デフォルトの名無しさん:2005/06/21(火) 00:00:45
>644
int xxx(const char *aptr, int asiz, const char *bptr, int bsiz)
{
}
647644:2005/06/21(火) 00:27:36
>>646
レスありがとうございます。
そう書いておいて
VILLA *vlopen(const char *name, int omode, xxx);
とすれば良いのでしょうか?
実際に試してみたところエラーは出ないのですが、関数の結果におかしな所があるので
合ってるかどうか良く分からないんです。
648デフォルトの名無しさん:2005/06/21(火) 00:32:06
649デフォルトの名無しさん:2005/06/21(火) 05:17:45
>>644
C の sqrt に関する情報を集めるといいことがあるかも。
650デフォルトの名無しさん:2005/06/21(火) 05:26:07
qsortのことだろうか・・・
651デフォルトの名無しさん:2005/06/21(火) 06:10:09
条件演算子って2つ使うことはできないのでしょうか?

例えば、以下のようなときです
・x1,x2,x3を取得し最小値を出力する。

#include<stdio.h>/*最小値を取得8*/

int main(void)
{
int x1 , x2 , x3 , min;

/*値を3つ取得*/
scanf("%d" , &x1);
scanf("%d" , &x2);
scanf("%d" , &x3);


min = (x1 < x2) ? x1 : x2;

min = (x3 < x2) ? x3 : x2;

printf("最小値は%dです。" , min);
return (0);

}
としましたが2番目のmin が反映されません・・・。
652651:2005/06/21(火) 06:16:07
min = (x3 < x2) ? x3 : x2;

min = (x2 < x3) ? x2 : x3;
と修正してもダメです(;´Д`)
653デフォルトの名無しさん:2005/06/21(火) 06:19:22
何がやりたいのかよくわからん。

最小値もとめるならこうじゃないのか?
min = (x1 < x2) ? x1 : x2;
min = (min < x3) ? min : x3;
654651:2005/06/21(火) 06:22:53
>>653
指摘どうもありがとうございます。
変数もうひとつ用意したら出来ました。
でも>>653さんのほうがシンプルですね・・・。
655デフォルトの名無しさん:2005/06/21(火) 08:29:00
つーか、あんた馬鹿? よく理解できないまま書いているだろ。
656デフォルトの名無しさん:2005/06/21(火) 11:59:30
[課題Q]3角形の底辺の長さ,高さをキーボードから読込み,その面積を計算するプログラムを作成しなさい.
ただし,底辺の長さ,高さ,面積の値を入れる変数名をそれぞれteihen, takasa,mensekiとし,いずれも実数型(double型)とする.


void main( void )
{
double teihen, takasa, menseki;

printf( "底辺は?\n" ); /* 入力を促すメッセージを表示 */
scanf( "%d", &teihen );

menseki = teihen * takasa / 2;
printf("%f\n",menseki);
}

これ誰か完成させてくれ
657デフォルトの名無しさん:2005/06/21(火) 12:14:18
findfirst関数を利用するために、いろいろ調べてみたら
ffblkという型の構造体を用意するとかかれていました。

ff_ftimeやff_fdateはどういう状態なのかを書いたサイトがあったのですが、
ff_reservedは調べてみてもよくわかりませんでした。

これってなんなんですか?
658デフォルトの名無しさん:2005/06/21(火) 12:24:34
>>656
マルチすなや。
659デフォルトの名無しさん:2005/06/21(火) 12:32:04
>>657
「予約済み領域」ではないかと思われ。
660デフォルトの名無しさん:2005/06/21(火) 13:41:01
どこの掲示板で書けばいいのかわからず、
とりあえずは、ここが近いと思い書かせてもらいます。

今、nmakeを使ってデータのみをコンパイルしたいと思い、
サクサクとコードを記述したのですが、C++コンソールで作成しました
ツールを動作させますと、実行結果は問題ないのですが、
下記のエラーが必ず出てしまいます。
nmake : fatal error U1077: 'fpatch.exe' : リターン コード '0x1f' Stop.

更に下記にnmake側のコードを記述します。
#**************************************
T= c:
#**************************************
ALL:\
$(T)\test.bin
#**************************************
$(T)\test.bin:
fpatch.exe
#**************************************
※fpatch.exe はc++コンソールで作成しました自ツールです。

試しに単なるprintf文だけ表示させるだけの実行ファイルを
fpatch.exeを入れ替えてnmakeを実行させますと
printfの内容は表示されるものの、やはり同じエラーが返ってきます。
開発環境でのOSはWindows2000ですが、何か問題があるのでしょうか?
661デフォルトの名無しさん:2005/06/21(火) 13:43:34
C++にリフレクションが無い理由を教えてください。
662660:2005/06/21(火) 13:47:41
すいません。nmake側のコードで記述されているタブが
どうも消されてしまっているようなので、
#**************************************
ALL:\
   $(T)\test.bin   ←タブ
#**************************************
$(T)\test.bin:
    fpatch.exe    ←タブ
#**************************************
書いときます。すみません;;
663デフォルトの名無しさん:2005/06/21(火) 13:48:31
>>660
そのメッセージのとおり、fpatch.exeの戻り値が31になってるんじゃないの?
main()の最後でちゃんとreturn 0してる?
664デフォルトの名無しさん:2005/06/21(火) 13:50:13
>>661
実装が難しいからだハゲ
665660:2005/06/21(火) 14:22:26
>>663
ぉおおおお!
main()側は確かに戻り値は指定していませんでしたので、
早速、修正しましたら、エラーがでなくなりました;;
なんと・・・戻り値がないだけで、エラーってましたか・・;;
素早い対応、感謝感激であります;;
666デフォルトの名無しさん:2005/06/21(火) 14:41:46
>>665
あのねぇ……
main()の戻り値(=exit()の引き数)はOSに対するエラー通知に使われるわけ。
makeツールはそれを実行したプロセス(この場合fpatch.exe)のエラー情報として使うわけ。
#まぁ、まともなmakeツールならそれを無視することもできるだろうけどね。
667デフォルトの名無しさん:2005/06/21(火) 15:05:15
>>665
正常処理の場合は0返さなきゃダメよ。
668デフォルトの名無しさん:2005/06/21(火) 15:06:37
すいません、凄く初歩的な質問なんですけれど
著/高橋 麻奈 やさしいC 第二版の49ページに基本形の表が書いてあるのですが、
long intとintの差がわかりません。
両方とも記憶できる値の範囲例が
int -2147483648~2147483647
long int -2147483648~2147483647
となっています。
これはintとlong intは同じと考えて良いのでしょうか?
669デフォルトの名無しさん:2005/06/21(火) 15:09:05
>>668
今現在の大抵の環境では、偶偶同じ長さというだけ。
また、同じという前提で書かれたプログラムも多数あるので注意。
670デフォルトの名無しさん:2005/06/21(火) 15:42:25
>>668
16bitコンパイラだと
int -32768~32767
long int -2147483648~2147483647
になったりする
671デフォルトの名無しさん:2005/06/21(火) 15:59:23
strtokが返してきたポインタに書き込んでも大丈夫?
672デフォルトの名無しさん:2005/06/21(火) 16:17:19
>>671
strtok()が返すポインタは、引数として渡した文字列のどっかを指している。
で、strtok()の仕様上、readonlyな文字列を渡すことができない。

というわけで、問題はないはず。
673デフォルトの名無しさん:2005/06/21(火) 16:20:53
>>671
strtok()が返すのはあんたが用意したメモリ空間だから構わないっちゃ構わないが、
混乱する元だから止めておいたほうがいいよ。
#つーか、strtok()自体スレッドセーフじゃないからお勧めできない。
674デフォルトの名無しさん:2005/06/21(火) 16:22:40
>>668
規格で決まってるのは

1) shortは最低16bit
2) longは最低32bit
3) sizeof short <= sizeof int <= sizeof long

ってことだけ。
16bitや64bitの環境を考慮する場合は気をつけろ。
675デフォルトの名無しさん:2005/06/21(火) 16:24:32
>>673
strtok()のスレッドセーフ版がstrtok_r()の場合もあるが、
Microsoft VC++のように、マルチスレッド版のCランタイムでは
strtok()という同じ名前でスレッドセーフにしている場合もある。

まあ、推奨しないのは俺も同感だがな。
676デフォルトの名無しさん:2005/06/21(火) 16:28:03
それじゃ何故区切られた文字列ポインタが帰ってくるのですか?
単語の終わりに0入れたら、次のstrtok呼び出し時、困るような気がするのですが。
文字列サイズが含まれてるわけでもないのに。
677デフォルトの名無しさん:2005/06/21(火) 16:31:20
>>676

libcのソースを見てもらうのが手っ取りはやいのだが
(VC++にもlibcのソースはついている)
典型的な、スレッドセーフ*でない*実装では、
次のトークンを指すstaticなポインタを内部で保持しとるのだよ。
それがトークン区切りの'\0'の後を指してるから、問題は無いわけ。
678デフォルトの名無しさん:2005/06/21(火) 16:32:33
>>676
疑問を感じたら実装に当たろう。
ソースを見れば一目瞭然。随分危ない橋を渡っているのが分かるはず。
679デフォルトの名無しさん:2005/06/21(火) 16:38:08
>>674
てことは、intが24bitなことも有りうる?
680デフォルトの名無しさん:2005/06/21(火) 16:45:17
安全圏内での書き換えは大丈夫ということですね。
レスThanks
681デフォルトの名無しさん:2005/06/21(火) 16:46:49
安全圏=0までの文字列
スレッドはシングル(コンソール)なので問題ないです。
682デフォルトの名無しさん:2005/06/21(火) 16:48:18
>>679

int=24ビットは実在するね。

http://www.chris-lott.org/resources/cstyle/indhill-cstyle.html
の、「Portability」の表を参照。

683デフォルトの名無しさん:2005/06/21(火) 16:49:37
>>679
規格上は有り得る。が、常識的な実装上はまずない。
684683:2005/06/21(火) 16:50:30
訂正。
「まずない」→「余りない」
勢い余っちまったw
685デフォルトの名無しさん:2005/06/21(火) 17:08:19
int i;
int* a = buf;

i = i+0x800;   //800h加算される
a= a+0x800;   //何故か0C80h加算される

aにbufオフセット800hをセットしたいのですがどうやればいいのでしょうか?
ちゃんと800h加算された事もあるのですが・・・・・・
686デフォルトの名無しさん:2005/06/21(火) 17:11:31
>>682-684
うおー
おもしれー
687デフォルトの名無しさん:2005/06/21(火) 17:21:26
>>685
pがポインタのとき、p+1はpの「次の要素」を指すポインタ。
つまり、pをsizeof (*p)バイト進めたもの。
明示的にアドレスをいじりたいなら、
a = (int *)((char *)buf + 0x800);
とでもするといい。
688デフォルトの名無しさん:2005/06/21(火) 17:26:58
どのみち0C80hでは計算があわんがのう
2000h加算される、とかなら分かるのだが
689685:2005/06/21(火) 17:27:16
>>687
なるほど。
この場合int(4byte)で4倍されていたのですね。
ありがとう。
690デフォルトの名無しさん:2005/06/21(火) 17:31:04
>>688
すみません、今みたら2000hになってました。
int* a = a+0x0800としてみたり、
int a = buf+0x800としたりやってたんで、間違いました。
691デフォルトの名無しさん:2005/06/21(火) 17:49:21
>>687
charが9ビットだったらsizeof(char)はいくつになるの?
っていうか((char *)buf + 0x800)がどうなるのか知りたい。
692デフォルトの名無しさん:2005/06/21(火) 17:50:32
>>691
sizeof(char)は必ず1になる。
693デフォルトの名無しさん:2005/06/21(火) 17:51:52
>>691
sizeof(char)は常に1だ。
仮にそれが9ビットだとしても変わらない。
694デフォルトの名無しさん:2005/06/21(火) 18:03:39
質問です。
今リスト構造というのを勉強してるのですが、
試行錯誤の末、↓のサンプルを作りました。
http://www.vipper.org/vip37005.txt

↑には
struct list * pop (struct list *pListTop , int &nNum)
という関数があります。
これはリストの前列の値をとりだして、
その後不要なメモリを削除する関数です。

取り出した値は第二引数の int &nNum に入れてるのですが、
戻り値をint型にするにはどうすればいいんでしょうか?

int pop (struct list *pListTop)

こんな感じで、取り出した値を戻り地にしたいんですが・・
わかりにくいプログラムで申し訳ありませんが、
どなたかお願いします m(__)m
695デフォルトの名無しさん:2005/06/21(火) 18:07:28
>>694
>int pop (struct list *pListTop)
ってすればいいじゃん。
何がわからないんだ?
696デフォルトの名無しさん:2005/06/21(火) 18:08:46
なんだってわざわざC++でこんなプログラムを……
というのはさておき

int pop(struct list**pListTop);
として、pListTopを値/結果引数にすると良いだろう。

ob1 = pop(ob1, nNum);
のようなコードのかわりに

nNum = pop(&ob1);
と書ける。
697デフォルトの名無しさん:2005/06/21(火) 18:14:04
>>695 >>696
レスどうもです。

>>695
それだと pListTopのアドレスが変わらないので、
結果がヘンになってしまっていたのです orz

>>696
実はこの後クラスにするつもりだったんですが、
リスト構造は初めてのため、理解するために
まず構造体で作ったたのですが・・

** だと、関数の中でアドレスを変えたら
呼び出し先のアドレスも変化するのでしょうか?
ちょっと今からやってみます。
698デフォルトの名無しさん:2005/06/21(火) 18:18:02
>>609
呼び出し側の値を書き換えたければポインタ/参照渡し。これ基本。
swap()の例ぐらいは流石にしってるでしょ?

struct list *pListTopを書き換えたければ&pListTopを渡す。
で、その型はstruct list**
ただそれだけのこと。
699デフォルトの名無しさん:2005/06/21(火) 18:37:36
C++なら、ポインタへの参照を使えばいいんじゃない?
700デフォルトの名無しさん:2005/06/21(火) 19:35:56
>>698
なんとかできました m(__)m
ポインタのポインタは使ったこと無いので、
記述方を調べるのに時間かかってしまいました。
これで大丈夫でしょうか?

int pop (struct list **pListTop)
{
struct list *pOldList; // リスト削除用
int nNum;

// リストが空の場合
if (*pListTop == NULL) {
cout << "リストは空です\n";
nNum = 0; // なんとなく0を入れとく
return nNum;
}

pOldList = *pListTop; // 取り出したあと削除するため、今のアドレスを保存
nNum = (**pListTop).num_data;
*pListTop = (**pListTop).nextlist; // 最前列のアドレスを、一個前のアドレスに変える

delete pOldList; // 値を取り出したので削除
return nNum;
}

あと、swap()の例とかいうの、知らない orz

>>699
はい。次はそれに挑戦してみます。ども。
701デフォルトの名無しさん:2005/06/21(火) 20:39:40
要素が-1,0,1のいずれかで、長さが10の配列 3^10通り をずべて求めたいのですが、
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
すべての場合を尽くして
{1,1,1,1,1,1,1,1,1,1}
にするためのアリゴリズムがわかりません・・。

どなたかご教授願います。(わかりにくい文章ですみませんorz)
702デフォルトの名無しさん:2005/06/21(火) 20:44:46
>>701
10ケタの3進数と考えればいいんじゃない?
703デフォルトの名無しさん:2005/06/21(火) 22:08:52
>>701
C++の<algorithm>にstd::next_permutation()なんてのがある。
704デフォルトの名無しさん:2005/06/21(火) 22:24:26
>701
案1.再帰を使う
void set(int *target, int idx)
{
 if(idx==10) { /* 処理 */ }
 else {
  int i;
  for(i=-1;i<=1;i++) { target[idx] = i; set(target, idx+1); }
 }
}
int main(void) { int array[10]; set(array, 0); }
案2.再帰をループに展開する
案3.ほぼ等価になるような気もするけど >702
int i, array[10];
for(i=0;i<10;i++) array[i]=-1;
do {
/* 処理 */
++array[0];
i=0;
while(i<10 && array[i]==2) { array[i]=-1,++array[++i]; } /* 繰り上がり処理 上の代入と合わせて for 文にすることも可能 */
} while(i<10);
705デフォルトの名無しさん:2005/06/21(火) 23:14:23
真面目に基数変換してみるとか。

#include <stdio.h>
void
foo(int m[], unsigned n)
{
for (unsigned i = 0; i < 10; ++i) {
m[i] = (n % 3)-1;
n /= 3;
}
}
int
main()
{
// 3^10 = 59049
int m[10];
for (unsigned i = 0; i < 59049; ++i) {
foo(m, i);
for (unsigned j = 0; j < 10; ++j) {
printf("%2d ", m[j]);
}
printf("\n");
}
return 0;
}
706デフォルトの名無しさん:2005/06/22(水) 00:27:12
50 00 00 00 0C 02 3C 00 38 30 00 00 00 00 00 00 P....<.80......
6B 61 67 65 2E 62 6D 70 00 00 00 00 00 00 00 00 kage.bmp........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50 00 00 00 44 32 3C 00 30 09 00 00 00 00 00 00 P...D2<.0.......
6B 61 67 65 2E 78 00 00 00 00 00 00 00 00 00 00 kage.x..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

このようなArchiveファイルのインデックスをメモリに読み込みました。
4hからの4バイトがArchive内の位置、8hからがファイルサイズ、
10hからがファイル名です。

void list(int *a)
{
int i;
int b = (archivesize - 0x0800 - 0x100)/0x050;    //アーカイブ内ファイル数
    a = a+0x200;                     //ファイル先頭
    for(i=0;i < b;++i){
       printf("%s\t%10d\t%d\n",&a[4], a[2], a[1]);
       a = a+0x14;                   //NEXTレコード(1レコード50hバイトなので)
    }
}
これを構造体として扱いたいのですが、どうすればいいのでしょうか?
707701:2005/06/22(水) 00:34:21
>>702,703,704,705
みなさんありがとうございまうす!
かなり勉強になりますね。自分も頑張ります^^;
708デフォルトの名無しさん:2005/06/22(水) 00:36:38
#pragma pack(4)
struct{
DWORD id;
DWORD pos;
LONGLONG filesize;
BYTE fname[0x40];
}
709デフォルトの名無しさん:2005/06/22(水) 00:45:15
typedef unsigned char Byte;
struct record {
Byte mark[4];
unsigned int32_t offset;
unsigned int32_t length;
unsigned int32_t dummy;
Byte fileName[0x40];
};
710デフォルトの名無しさん:2005/06/22(水) 01:06:18
>>708さん、>>709さん、ありがとう。

マニュアルで#pragma、pack見てるのですが解りません。
宣言ですよね?
WisdomSoftなどを参考に、最初↓こんな感じで書きました。
struct fillist{
    int ID;
    int pos;
    int filesize;
    int dum;
    char name[0x40];
}

struct fillist a{
    a.ID = //どうしてよいやら・・・・・・
711デフォルトの名無しさん:2005/06/22(水) 01:26:57
pragmaは処理系依存なので以下略。
地道にメンバごとに読み込んでくのが以下略。
712706、710:2005/06/22(水) 04:11:44
void list(int *a)
{
typedef unsigned char Byte;
struct record {
    Byte mark[4];
    unsigned int pos;
    unsigned int len;
    unsigned int dummy;
    Byte fileName[0x40];
   };
int i;
int b = (decsize - 0x0800 - 0x100)/0x050;
struct record *ptr;
    ptr = a;
    ptr = (char *)ptr+0x0800;
    for (i = 0;i < b;++i) {
      printf("%s\t\t%d\t%d\n", ptr->fileName, ptr->len, ptr->pos);
      ptr = (char *)ptr+0x50;
    }
}
これで一応動いたんですけど、これでいいのでしょうか?
何故構造体で扱いたかったかと言うと、Win32APIのlistviewでファイル選択
したかったからなのです。
713デフォルトの名無しさん:2005/06/22(水) 05:05:54
typedefやstructをそんなとこでやるもんじゃねぇ
てかBYTEは既にWINDEF.hでtypedefされとるんだからそれ使えばええじゃろ
714709:2005/06/22(水) 06:08:01
私ゃ環境が提示されてなかったからByteをtypedefしたんだがね。
715デフォルトの名無しさん:2005/06/22(水) 06:46:10
環境聞けよ
716デフォルトの名無しさん:2005/06/22(水) 07:09:53
#ifndef使えばどこでも動くけどな
717デフォルトの名無しさん:2005/06/22(水) 07:17:00
>>709
unsigned int32_t って大丈夫?
uint32_t じゃない?
あと、 int32_t 使うなら Byte も uint8_t でいいんじゃね?
718デフォルトの名無しさん:2005/06/22(水) 07:23:25
おいおい、そもそもuint32_tがなんだと思ってるんだ・・・
719717:2005/06/22(水) 07:29:57
>>718
ちょうど32ビットのビット幅を持つ符号無し整数型。
んー。なんか勘違いしてるのかな。
720デフォルトの名無しさん:2005/06/22(水) 09:44:37
基本型使えばいいやん。あほらし
721デフォルトの名無しさん:2005/06/22(水) 15:07:53
WINの改行コードは\r\nですが
fprintf(fp,"sentence\n");
としたとき、\r\nに書き換わりますが、どういう仕様なのでしょうか?
strstr(str,"\n");としたときや、
strlen(str);// str="123\n"
strtok(str,"\n"); など
どのように処理されるか疑問です。処理系によるんでしょうか。
置換処理だけで、あとはそのままの処理('\n'なら'\n'で'\r'なら'\r'で'\r\n'なら'\r\n')の
気がしますが。
説明下手かもしれません。
722デフォルトの名無しさん:2005/06/22(水) 15:14:26
>>721
テキストモードでオープンされたファイルに対し、
書込時には'\n'を'\r'+'\n'のコードに、
読込時には'\r'+'\n'を'\n'のコードに、
それぞれ置き換えているだけ。

プログラム内部では'\n'は'\n'で'\r'は'\r'だ。
723デフォルトの名無しさん:2005/06/22(水) 15:30:07
fgetsで取得した文字列の改行は
\r\nだったような気がしますが?
724デフォルトの名無しさん:2005/06/22(水) 16:24:51
>>723
バイナリモードでファイルを開いていれば、そうなるわなあ
テキストモードなら、行末は\nで終端だよ

その辺は、libcの中でも、stdioよりもっと低レベルの層でやってる。
725デフォルトの名無しさん:2005/06/22(水) 19:12:31
fgets取得の文字列を実験してみた。
text.txt内:"100\r\n" -> つまり、100と改行のみ
int main(void)
{
char buffer[256];
FILE* fp = fopen("text.txt","r");
fgets(buffer,256,fp);
printf( "%d\n", strtol(strtok(buffer,"\r"),0,10) );
printf( "%d\n", strstr(buffer,"\r") );
return 0;
}
結果は
100
0
でした。
strstrは、予想通りの結果で、strtokは\rでも区切りに成功してます。
726デフォルトの名無しさん:2005/06/22(水) 19:22:52
>725
ところで、このコードの実行結果について、どうおもう?
char p[]="100";
printf( "%d\n", strtol(strtok(p,"\r"),0,10) );
printf( "%d\n", strstr(p,"\r") );
727デフォルトの名無しさん:2005/06/22(水) 19:24:32
Windowsでトリップ(2chのものと一致しなくても可)を生成したいんですけど、簡単にする方法ってないですか?
728デフォルトの名無しさん:2005/06/22(水) 19:30:59
何に使うの?
729デフォルトの名無しさん:2005/06/22(水) 19:38:57
>>727
「ハッシュ関数」で検索。
730デフォルトの名無しさん:2005/06/22(水) 19:42:35
cryptを使う?
731デフォルトの名無しさん:2005/06/22(水) 19:59:32
>>725
ダンプイメージで確認してみろ。
732デフォルトの名無しさん:2005/06/22(水) 20:05:03
文字列終端に対しての区切りだった...。
733デフォルトの名無しさん:2005/06/22(水) 21:07:02
多重ループで九九の表を作ったんですけど
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
・・・

みたいにずれてしまいます。もう少しきれいに表示させるのはムリなんですか?
734デフォルトの名無しさん:2005/06/22(水) 21:08:56
>>733
数字と数字の区切りにタブを使ったり、フィールド幅を指定したりすればいい。
735デフォルトの名無しさん:2005/06/22(水) 21:08:59
>>733
%2d
736デフォルトの名無しさん:2005/06/22(水) 21:09:15
よく考えると桁の関係でどうしようもない気がしますけど・・・。
737デフォルトの名無しさん:2005/06/22(水) 21:12:26
>>735
すごい、それでうまくいきました、ありがとうございます。

>>734
それは、まだ知らないです(;´Д`)勉強します。
738デフォルトの名無しさん:2005/06/22(水) 21:27:43
>>737
フィールド幅の指定は>>375の通り
739デフォルトの名無しさん:2005/06/22(水) 21:35:04
C++のクラス定義で
class 文字列 クラス名というのを見かけるのですが
この文字列はどういったものなのでしょうか?
740デフォルトの名無しさん:2005/06/22(水) 21:38:13
もうちょっと具体的に
741デフォルトの名無しさん:2005/06/22(水) 21:38:20
class "Hoge" foo?
ありえねーっつーの
742デフォルトの名無しさん:2005/06/22(水) 21:43:47
class hoge : public hage

のこと?
743デフォルトの名無しさん:2005/06/22(水) 21:45:55
>>740
すみません。
class _EXP Foo {
 Foo();
}
こんな感じなのですが・・・あまり詳しくなってません
744デフォルトの名無しさん:2005/06/22(水) 21:59:30
_declspec(dllexport)
745デフォルトの名無しさん:2005/06/22(水) 22:03:29
>>744
ありがとうございます。
検索してみます
746740:2005/06/22(水) 22:05:58
>>739
記憶クラスの拡張属性
747デフォルトの名無しさん:2005/06/22(水) 22:17:40
>>746
なるほど、理解が深まります。
ありがとうございました
748デフォルトの名無しさん:2005/06/22(水) 22:43:08
ホントにわかってんのかな?
749デフォルトの名無しさん:2005/06/23(木) 01:42:42
たぶん匿名なのを良い事にまた同レベルの質問を性懲りもなくしてくる
750デフォルトの名無しさん:2005/06/23(木) 02:32:03
説明が足りなかったらすいませぬ、

static unsigned long *Data = NULL;
static int X, Y;
:
:
int size = sizeof(unsigned long) * X * Y;
Data = (unsigned long *)malloc(size);

のmallocの部分をnewにするにはどう組み替えればできまつか?
new unsigned long (size)とか試してたんでつが、できる気配もなく・・・
751デフォルトの名無しさん:2005/06/23(木) 02:37:08
Data = new unsigned long[X * Y];
752デフォルトの名無しさん:2005/06/23(木) 02:39:33
>>750
Data = new unsigned long[X*Y];
:
:
delete [] Data; //← delete Data; じゃだめよ
753デフォルトの名無しさん:2005/06/23(木) 03:04:18
>>751,752
なんと[]で囲むのでつか。
deleteのほうもなるほど・・・お二人共ありがとうございますだ。
754デフォルトの名無しさん:2005/06/23(木) 07:07:38
「囲む」っていう表現から、微妙に勘違い臭が感じられる・・・。
755デフォルトの名無しさん:2005/06/23(木) 08:41:46
BOOL WINAPI GetVersionString(LPTSTR lpBuffer); // lpBuffer:文字列を格納するバッファ
という関数で lpBuffer の代わりに string buf を使うことは出来ませんか?
756デフォルトの名無しさん:2005/06/23(木) 10:10:35
buf.c_str()
757デフォルトの名無しさん:2005/06/23(木) 10:16:47
>>756
書き込む前に試したけど無理でした。
'const char *' から 'LPTSTR' に変換できない
というコンパイルエラーが出ます。
758デフォルトの名無しさん:2005/06/23(木) 10:41:24
>>755
LPTSTRはtypedef TCHAR *LPTSTRなので
const char* c_str()は渡せない(constが邪魔)
間違っても::GetVersionString(const_cast<char*>(buf.c_str());
とかやらないでね
759デフォルトの名無しさん:2005/06/23(木) 11:07:23
マイクロソフトはSTL敬遠してるから止めとけ。
CString,CList,CArrayを用意するくらいだからな。
素直にTCHARの配列渡せばいい。どうせ頻繁に呼ぶわけじゃないんだし。
760デフォルトの名無しさん:2005/06/23(木) 11:22:48
>>759
> マイクロソフトはSTL敬遠してる

はつみみです。
761デフォルトの名無しさん:2005/06/23(木) 11:25:35
質問です。
携帯JAVAから入ったC++初心者なのですが、
class CHoge{
public:
static int test(){
return 0;
}
}

void main(){
int a = CHoge.test();
}

とやりたいのですが、JAVAと違ってC++ではうまくいきません。
もちろん言語が違うのでC++の作法に合わせなければと思ったのですが、VC6.0が
「error C2275: 'hoge' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。」
これが理解できません。
そんなアクセス演算子使ってないorz
どなたかご教授お願いできますでしょうか。

C++のサイトを見て回った感じ、私のやりたいことをやるには。
void main(){
CHoge hoge;
int a = hoge.test();
}
とすればよいように見えるのですが、なるべくならCHogeのメソッドをそのまま呼べるのが嬉しいです。
762デフォルトの名無しさん:2005/06/23(木) 11:28:47
>>761
int a = CHoge::test();
C++ではクラス名の後には::をつける。
763デフォルトの名無しさん:2005/06/23(木) 11:29:46
>>761
CHoge::test()
C++はメンバアクセスの演算子が場合に応じて色々。これはおぼえるしかない。
764デフォルトの名無しさん:2005/06/23(木) 11:36:31
>>762-763
ありがとうございます!
早速試してみたらうまくいきました(`・ω・´)
765デフォルトの名無しさん:2005/06/23(木) 12:28:33
アスタリスクで
*
***
*****
・・・
と表示させるプログラムは出来たんですけど、これを
  *
  ***
  *****
みたいに中央寄せ?はできないのでしょうか・・・?
初歩っぽい質問ですいません。
766765:2005/06/23(木) 12:31:56
--*--
-***-
*****
みたいに三角にってことです。火狐でずれた;;
(-は見やすいように書きました)
767デフォルトの名無しさん:2005/06/23(木) 12:33:39
>>765-766
そうなるようにプログラムを組めば出来るよ。
768デフォルトの名無しさん:2005/06/23(木) 12:40:04
無責任なアドバイスに見えて実は核心に
769デフォルトの名無しさん:2005/06/23(木) 12:46:27
>>767
痛いところを(;´Д`)
とりあえずもう少しやってみます。

770デフォルトの名無しさん:2005/06/23(木) 12:56:43
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main()
{
    char ary[10];
    strcpy(ary ,"1.23456");
    double dig;
    dig = atoi(ary);
    printf("%lf\n", dig);

}

これをやっても小数が代入されずに値が1.000000になってしまいます。
小数でなければうまくいくのですが…。
771デフォルトの名無しさん:2005/06/23(木) 12:58:06
atoiがどういう関数か調べろドアホ
772デフォルトの名無しさん:2005/06/23(木) 13:00:48
ついでに、
>void main()
この辺とか
>printf("%lf\n", dig);
この辺、要注意で。
773デフォルトの名無しさん:2005/06/23(木) 13:07:42
質問させてください。
C++ではnewはアドレスを返すんで、Hogeクラスのオブジェクトを生成するとき
Hoge * pobj = new Hoge();
ってやって、メンバへのアクセスは
pobj->func();
とかやるわけですが、JAVA風に参照で書きたくて
Hoge & obj = * new Hoge();
というふうにやって
obj.func();
という感じでメンバにアクセスすることを考えてみました。
BCC5.5では基本的にきちんと動くようです。

こういうやり方に何か問題点とかありますか?
たとえば余計なコンストラクタが呼ばれるとかメモリを余分に使うとかそういう類。
その他にも、保守性、可読性、生産性、互換性などに関しても気になります。
ばかげた質問かもしれませんが、アドバイスよろしくお願いします。
774デフォルトの名無しさん:2005/06/23(木) 13:07:55
>>766
考えてみよう。

その表示を見ると、
・左側の空白
・アスタリスクの列
・右側の空白
の三つに分けられる。

左側の空白はn段のときはn-1, n-2, ... 0、
アスタリスクは同じように1, 3, ... 2*n-1、
右側の空白も左側と同じだけ、記号が並んでいる。
と言うことは、
for (int i = 0; i < n; ++i) {
}
というループを考えるならそれぞれ、n-1-i, 2*i+1,n-1-i個ということだ。
従って、ループの中身は
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
for (int j = 0; j < 2 * i + 1; ++j) {putchar('*');}
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
putchar('\n');
ということになる。

この辺りをベースに、もっと要領のいい方法がないか模索してもいいね。
775デフォルトの名無しさん:2005/06/23(木) 13:10:07
>>773
>JAVA風に参照で書きたくて
この辺が間違い。
つーか、本当にnewする必要があるかどうか検討してみよう。
例えばローカルに必要なオブジェクトなら、
int anyFunction()
{
Hoge obj;
...;
}
だけで充分なわけだ。
#クラスが巨大なら話は別だが。
776デフォルトの名無しさん:2005/06/23(木) 13:10:30
>>772
void main()では何かまずいことでもあるんですか?
値を返さないので別に問題ないと思いますが…。

printf("%lf\n", dig);
よくみたらlいりませんね。
printf("%f\n", dig);これでもOKでした。
777デフォルトの名無しさん:2005/06/23(木) 13:11:33
>774の
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
for (int j = 0; j < 2 * i + 1; ++j) {putchar('*');}
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
                        ↑この辺が顔文字っぽくて可愛いw
778デフォルトの名無しさん:2005/06/23(木) 13:13:06
>>776
C/C++の仕様では、intの戻り値を返すことが決められている。
承知の上で無視するなら兎も角、きちんと理解しておくことをお勧めする次第。
779デフォルトの名無しさん:2005/06/23(木) 13:13:52
>>775
そうそう。
破棄するタイミングを調整したいなら複文化すればいいしね。
780デフォルトの名無しさん:2005/06/23(木) 13:14:56
>>778
int main ()
{
    return 0;
}
なるほど、こっちのほうがいいということですね。
781773:2005/06/23(木) 13:20:32
>>775
> この辺が間違い。
> つーか、本当にnewする必要があるかどうか検討してみよう。

もちろん本当にnewする必要がある場合の話です。
たとえば大量のインスタンス作る必要があるときなどは当然newする必要があると思います。
おっしゃる通りクラスが巨大な場合もあるでしょう。

コードを簡略化したので無駄なことをやっているように見えたかもしれませんが、実際には本当に必要な場面を想定してほしかったです。
説明不足ですみません。

とりあえず
Hoge & obj = * new Hoge();
というステートメントに焦点を充ててもらえたらと思います。
782デフォルトの名無しさん:2005/06/23(木) 13:37:24
保守性・可読性は悪くなるだろうな。
deleteするとき delete &obj; なんて書かなきゃならんし
なにより他の人が見て混乱しそうだ。
783デフォルトの名無しさん:2005/06/23(木) 13:41:04
>>773
問題ない。
784デフォルトの名無しさん:2005/06/23(木) 14:03:53
>>778
C++ではint main()以外も禁止されてねーぞ。
785デフォルトの名無しさん:2005/06/23(木) 14:09:44
>>781
自分もJavaを触ることの方が多いけど、
Hoge & obj = * new Hoge();
C++でこんな書き方する奴がそばにいたら、蹴とばします。

786デフォルトの名無しさん:2005/06/23(木) 14:11:13
>>773
objを配列化に変更するとき面倒。
うっかり std::vector<Hoge> foo みたいなコンテナに入れて酷い目に。
787デフォルトの名無しさん:2005/06/23(木) 14:12:33
>>784
It shall have a return type of type `int', but otherwise its type is implementation-defined.
ってあるんだけど。3.6.1の2ね。
788773:2005/06/23(木) 14:13:02
>>779
> 破棄するタイミングを調整したいなら複文化すればいいしね。

ちょっと意味がわからないです。
すみません。

>>782
そうですね。
delete するときは delete * obj; なので、宣言するときと破棄するときの2点だけは気をつけないといけなくなってしまいますね。
ただその他の点では可読性に関して利点があるように思います。
とりあえずC++でインスタンスを参照によってアクセスすることで、変数が「ポインタであるかどうかの識別」が必要なくなるのではないかと考えました。
「参照かどうかの識別」は大概必要ないですし。
ポインタに慣れていればいるほど無意味さを感じるかと思いますが、全てのメンバに同じ方法でアクセスできるようになることは利点ではないかと。
例えば関数の引数でオブジェクトを参照渡しする場合など、呼び出し前の姿と呼び出し後の姿が同じになるわけです。
そういう意味でなるべく参照で扱うということによる利点はあるのではないかと思いました。
保守性に関しては微妙ですねw
789デフォルトの名無しさん:2005/06/23(木) 14:14:16
>>785
俺は>>781じゃないけど、何でそれがまずいのか教えて欲しい。
790773:2005/06/23(木) 14:24:11
>>786
う、たしかにそれはイタイですね・・・。
テンプレートへの対応がかなりマズそうですね。
あ、あとdelete & obj;ですね。寝ぼけてました。
そろそろ吊ってくる時間かもです。
おやすみなさい。

>>785
わかってて言っているのか謎ですが、とりあえず屋上でケツでも晒して這い蹲って待ってます。
791775:2005/06/23(木) 14:36:23
>>773
例えば、
関数の途中でオブジェクトを破棄しておきたい場合、
int func()
{
Hoge * foo = new Hoge;
...;
delete foo;
...;
return 0;
}
となる。これを、newを使わない場合は
int func()
{
{// from
Hoge foo;
...;
}// to
...;
return 0;
}
とすればfrom突入で生成されてto脱出で破棄されることが保証される。

私が言いたいのは、C++なんだから郷に入れてはってことでJAVA風に書くことに拘るのが間違い、と言うこと。
792デフォルトの名無しさん:2005/06/23(木) 14:43:14
>私が言いたいのは、C++なんだから郷に入れてはってことでJAVA風に書くことに拘るのが間違い、と言うこと。
そういう話じゃないんじゃないか?
newの結果を参照で受けることの利点欠点を論じろよ。
793775:2005/06/23(木) 14:48:29
>>792
その点については>782に同意。
794デフォルトの名無しさん:2005/06/23(木) 14:55:48
>>793
可読性に関する反論もあるけど(>>788)。
まー今更どーでもいーけど。
795デフォルトの名無しさん:2005/06/23(木) 16:07:23
char型の配列の末尾に、int型の変数aに入っている2という値を文字として
入れるにはどうしたらいいですか?   
796デフォルトの名無しさん:2005/06/23(木) 16:36:15
>>795
char buf[100] = "for example:":
sprintf(strchr(buf, '\0'), "%d", a);
797デフォルトの名無しさん:2005/06/23(木) 16:53:17
>796

ありがとうございます。できました。
798デフォルトの名無しさん:2005/06/23(木) 16:54:19
この板見てるとsprintfって使う人よく見掛けますね。
人気がある関数なんですか?
799デフォルトの名無しさん:2005/06/23(木) 16:56:32
この板見てるとprintfって使う人よく見掛けますね。
人気がある関数なんですか?
800デフォルトの名無しさん:2005/06/23(木) 17:10:37
一般論として女性のプログラマは色っぽいよな
801デフォルトの名無しさん:2005/06/23(木) 17:11:32
>>800
ケツにブツブツができてるのを見てからいまいち…
802デフォルトの名無しさん:2005/06/23(木) 17:14:56
>>798
snprintf()が標準じゃないから。
803デフォルトの名無しさん:2005/06/23(木) 17:17:54
>>801
ナマナマしい体験ありがとう
804デフォルトの名無しさん:2005/06/23(木) 17:18:37
何かと思ったらずーっとPCの前に座ってるからなんだな
805デフォルトの名無しさん:2005/06/23(木) 17:20:11
>>804
ちょっと待て!PCの前に座ってるとケツにブツブツができるのか!?
806デフォルトの名無しさん:2005/06/23(木) 17:20:45
>>796
strrchr() で \0 がひっかけられることを初めて知ったC歴12年の自分。
807デフォルトの名無しさん:2005/06/23(木) 17:21:14
>>805
あせもみたいなもんじゃないかな?
808デフォルトの名無しさん:2005/06/23(木) 17:26:05
みんなも気をつけようネ!
809デフォルトの名無しさん:2005/06/23(木) 17:28:02
風呂できちんとあらっていればならないんですけどね、見落としがちな罠です
810デフォルトの名無しさん:2005/06/23(木) 17:30:33
結論
>>801はケツを洗わない女と(ry
811デフォルトの名無しさん:2005/06/23(木) 17:34:35
>>806
strrchrでもいけるとは漏れも初めて知った。
812デフォルトの名無しさん:2005/06/23(木) 17:37:59
>>796はstrchr()だけどね。
813デフォルトの名無しさん:2005/06/23(木) 17:41:43
>>812
strchrで'\0'検出はごく自然だけどね。
814デフォルトの名無しさん:2005/06/23(木) 17:47:26
C89/C90/C99で規格上どーなってるか知らないけど、
FreeBSDのstrrchr(3)のmanには'\0'検出のことはちゃんと明言されてるな。

DESCRIPTION
The strrchr() function locates the last occurrence of c (converted to a
char) in the string s. If c is `\0', strrchr() locates the terminating
`\0'.
815デフォルトの名無しさん:2005/06/23(木) 17:48:40
ずっと、&buf[strlen(buf)]って書いてた……
816デフォルトの名無しさん:2005/06/23(木) 17:52:46
まあmemchr(s, 0, INT_MAX)
とかでもいいけど
strchr()はなかなかエレガントだな
817デフォルトの名無しさん:2005/06/23(木) 17:55:18
>>816
同意
818デフォルトの名無しさん:2005/06/23(木) 17:57:51
>>815
もしかして
fgets()の改行切り捨てるのにも
buff[strlen(buff)-1] = '\0';
とか書く口?
819812:2005/06/23(木) 18:05:34
それはchar * p = strrchr(buff, '\n'); if (p) {* p = '\0';}だなぁ。
820815:2005/06/23(木) 18:13:54
>819
昔、そんな感じのコードを書いた記憶がありまつ
821デフォルトの名無しさん:2005/06/23(木) 18:20:19
>>818
それでも全然問題ないように見えるんだけど、ダメなの?
822デフォルトの名無しさん:2005/06/23(木) 18:22:34
>>821
fgets()の場合、末尾に必ず改行がついてるとは限らないので、よろしくない。
俺は常に

if (p = strchr(buff, '\n'))
  *p = '\0';

だね。
823デフォルトの名無しさん:2005/06/23(木) 18:23:51
まあこう書くと、条件式で代入を使ってるとか
ウザい警告を出すコンパイラもあるけれど
824デフォルトの名無しさん:2005/06/23(木) 18:25:14
>>822
あぁ、そうか
stdinから読み込むことばかり考えてた
stdinからなら必ず改行が着くから無問題だよね?
825デフォルトの名無しさん:2005/06/23(木) 18:33:48
一行がバッファ長を超えなきゃね。
826デフォルトの名無しさん:2005/06/23(木) 18:42:14
CTRL-D(またはCTRL-Z)を行の途中で二度押された場合も終端には改行がつかずに終了するぞ。
827デフォルトの名無しさん:2005/06/23(木) 18:57:59
>CTRL-Z)を行の途中で二度押された場合も終端には改行がつかずに終了するぞ。
どこのOSですか?
828デフォルトの名無しさん:2005/06/23(木) 19:32:23
UNIX系は大抵Suspendだったような。<CTRL+Z
829デフォルトの名無しさん:2005/06/23(木) 19:44:54
自作OSじゃね?
830デフォルトの名無しさん:2005/06/23(木) 19:52:56
>>827
Windows NT系のcmd.exeはそういう挙動だと思った
command.comはもっと間抜け
831デフォルトの名無しさん:2005/06/24(金) 01:18:08
>>827
CP/M 思想を取り込んでいるOS
832デフォルトの名無しさん:2005/06/24(金) 01:21:12
DOSもWindowsもC-zでEOFになるのは、行の先頭に
きたときだけだった気がするけどなあ。
833デフォルトの名無しさん:2005/06/24(金) 01:28:34
>>832
マジ?????初耳w
834へこぽん:2005/06/24(金) 02:54:06
下記scanfの数値をビット表示できないのですが間違いを教えて下さい。
#include <stdio.h>
void print_bit(int na);
int count_bit(void);
int main(void)
{
int na;
printf("数値を入力");
scanf("%d",&na);
print_bit(na);

return 0;
}
/*ビット表示*/
void print_bit(int x)
{
int i;
for(i=count_bit()-1; i>=0; i--){
x>>=i;
printf("%d",(x & 1U )? '1' : '0');
}
}
/*ビットのカウント(桁)*/
int count_bit(void)
{
int i;
int count=0;
for(i=~0U; i>=0; i>>=1)
count++;
return count;
}
835デフォルトの名無しさん:2005/06/24(金) 03:25:58
Ctrl-c 同じプロセスグループのフォアグラウンドプロセス全てににSIGINTを送ります。
Ctrl-v エスケープ記号を打ちます。(例: Ctrl-v ESC c Enter)
Ctrl-s 端末を固めます(XON)。
836デフォルトの名無しさん:2005/06/24(金) 04:18:15
>>834
count_bit
837デフォルトの名無しさん:2005/06/24(金) 04:48:36
fread関数がビッグエンディアン式にデータ読み取る環境にあるんですが、
データファイル(バイナリ)自体はリトルエンディアンで
いちいち1バイトずつ読み込むのは大変なんで
何か良い方法はありませんか?
838デフォルトの名無しさん:2005/06/24(金) 05:30:49
>fread関数がビッグエンディアン式にデータ読み取る環境
はて?

書くほうにhtonlとかで書くように頼めば?
839デフォルトの名無しさん:2005/06/24(金) 05:53:06
>>838
4バイトとか細切れに読み取っていくしかなさそうで。
htonlは便利そうですね。もう書きましたが...。
レスありがとうございました。
840デフォルトの名無しさん:2005/06/24(金) 10:50:09
>>837
12 34 56 78
って言うファイルを
78 56 34 12
で読み取ってくるの?なんかすげーな。
841デフォルトの名無しさん:2005/06/24(金) 12:32:33
>>837
エンディアンについて勘違いしてる悪寒。
842デフォルトの名無しさん:2005/06/24(金) 14:19:02 BE:58230656-#
ビッグエンディアン
 上位アドレスに下位ビットを配置する狂った思想。
 データ列の解釈がアクセス幅に依存する。
843デフォルトの名無しさん:2005/06/24(金) 14:39:27
リトルエンディアンのほうが変だろ
844デフォルトの名無しさん:2005/06/24(金) 15:06:36
大きい桁を先に書く記数法が変。
845デフォルトの名無しさん:2005/06/24(金) 15:12:01
アセンブラ使い→リトルエンディアン支持
C言語使い→ビックエンディアン支持
846デフォルトの名無しさん:2005/06/24(金) 15:20:53
>>840
シークの仕方は先頭からだが
変数へバイトデータを入れるのはエンディアンで変わるだろ
847デフォルトの名無しさん:2005/06/24(金) 15:54:07
ものすごく初歩的な質問かもしれませんが、他のファイルのクラスを利用したい場合って、
そのクラスの宣言部分を含んだファイルをincludeするしかないんでしょうか。

class hoge{
  int A;
public:
  int ShowA(void);
}
int hoge::ShowA(void){
  return A
}

というクラスがあったとして、
extern class hoge;
extern int hoge::ShowA(void);
みたいな事がしたいのですが…。
848デフォルトの名無しさん:2005/06/24(金) 15:56:20
>>847
だから普通はヘッダに宣言を書いてcppには関数本体だけを置くようにする。
849';'抜けているよ:2005/06/24(金) 15:58:57
インラインはOKだけどな。

class hoge{
  int A;
public:
  int ShowA(void){return A;}
};
850デフォルトの名無しさん:2005/06/24(金) 16:02:07
const char *str;
char *tmp;

ofstream to("test");
if(!to.is_open()) return 0;
to<<str<<endl;
to.close();

ファイルにconst char *型の文字列を出力しようとすると、ofstreamのあとに内容が変わるんですけど、何か間違ってるんでしょうか
851デフォルトの名無しさん:2005/06/24(金) 16:02:10
>>848
やっぱりそうするしかないですか…。
どうもありがとうございます。

>>849
う、書いてから気づきました。
そういうふうに書いてもインライン関数になるんですね。
852デフォルトの名無しさん:2005/06/24(金) 16:21:10
>>850
strが初期化されて無いぞ
853デフォルトの名無しさん:2005/06/24(金) 16:46:57
>>844
なら、十は「01」で百は「001」か?
854デフォルトの名無しさん:2005/06/24(金) 17:00:37 BE:15528342-#
>>853
機械が解釈する場合はその方が都合がいい。
855デフォルトの名無しさん:2005/06/24(金) 17:36:24
>>846
エンディアンをわかってないね。
856デフォルトの名無しさん:2005/06/24(金) 17:42:02
どこがどう間違っているか指摘してくれないと
何が言いたいかわかりせん。
857デフォルトの名無しさん:2005/06/24(金) 17:42:45
↑846
858デフォルトの名無しさん:2005/06/24(金) 17:43:28
右から左に綴る自然言語(アラビア語など)でも数字は左から右だよね。
859デフォルトの名無しさん:2005/06/24(金) 17:57:55
>変数へバイトデータを入れるのはエンディアンで変わるだろ

あのさぁ、
char* p={0x12,0x34,0x56,0x78};
がエンディアンによって
p[0]=0x78
p[1]=0x56
p[2]=0x34
p[3]=0x12
なんてなるわけ無いだろ。
860デフォルトの名無しさん:2005/06/24(金) 18:08:28
00 01 を 変数aに書き込む時、
リトルエンディアンだったら
a = 1
だけど
ビッグエンディアンであれば
a = 0x100
で結局はエンディアン都合でデータ変わるって。
そのバイト区切りの配列の例は、例になってません。
せめて、0x12345678とかにしないと
エンディアン影響ゼロ
861デフォルトの名無しさん:2005/06/24(金) 18:12:16
>バイトデータを入れるのは
読めない?
862デフォルトの名無しさん:2005/06/24(金) 18:13:51
というか元々freadの話だろ。
>>859の説明で充分だと思うが。
863デフォルトの名無しさん:2005/06/24(金) 18:16:56 BE:52408139-#
>>858
自然言語の読み進む方向を「上位」と定義するならアラビア語とかは(数値の表記も含めて)
リトルエンディアンということになるわけだが。
864デフォルトの名無しさん:2005/06/24(金) 18:17:32
"abcdefg"
っていうテキストファイル読み込んだらエンディアンによって
"gfedcba"
になるって言ってんだろ>>846は。
865デフォルトの名無しさん:2005/06/24(金) 18:17:36 BE:27175027-#
>>860
「変数a」のアクセス幅は?
866デフォルトの名無しさん:2005/06/24(金) 18:24:18
変数をメモリマップで考えると分かりやすいと思う
867デフォルトの名無しさん:2005/06/24(金) 18:57:31 BE:69876566-#
>>866
ロードとストアでアクセス幅が同じならば、データ列のイメージはエンディアンに依存せず
同じになる。
868デフォルトの名無しさん:2005/06/24(金) 19:08:15
struct hoge{
union{
int i;
char c[4];
};
};

VC++のデバッグで確認したら
i = 0x12345678
c[0] = 0x78,c[1] = 0x56,c[1] = 0x34,c[1] = 0x12
だった(;´Д`) 
869デフォルトの名無しさん:2005/06/24(金) 19:14:57
エンディアンについて悪寒なのが多いのか?
ビックエンディアンだろうが同一機種ならなんも問題ない。
ビックエンディアンが不便なのは符号拡張をするときだ。
どっちだろうが a = 0x0001 とすれば1が入る。
メモリに書き出す時にその違いが出るのであって、
レジスタレベルでエンディアンが分別されることはない。

エンディアンの名前の由来はガリバー旅行記だ。
870デフォルトの名無しさん:2005/06/25(土) 00:05:51
そもそもエンディアンで宗教戦争するのは無意味。
だからエンディアンという。
871デフォルトの名無しさん:2005/06/25(土) 00:18:55
『Technical Master はじめてのプログラミング』(秀和システム)という本で今日から勉強を始めたところです。
コンパイラはBorland C++ Compiler 5.5です。


#include <stdio.h>

main()
{
printf("こんにちは、世界");
}

というプログラム(hello.c)をコンパイルしようとしているのですが、何度やっても

C:\TM-C>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
警告 W8070 hello.c 6: 関数は値を返すべき(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: ファイル UUID.LIB が開けません

となってしまいます。どこが問題なのでしょうか?
872デフォルトの名無しさん:2005/06/25(土) 00:28:42
もし本当にその本に

#include <stdio.h>

main()
{
printf("こんにちは、世界");
}

と書いてあったならそんな本は捨てること。今すぐ捨てること。
873デフォルトの名無しさん:2005/06/25(土) 00:28:49
>どこが問題なのでしょうか?
あんたの頭。
874デフォルトの名無しさん:2005/06/25(土) 00:29:16
>>871
ilink32.cfgは書いた?
875デフォルトの名無しさん:2005/06/25(土) 00:30:32
>>872
なんで?
そのサンプル、K&Rの最初の例に酷似してると思うんだが

もしかして日本語リテラルをCソースコードに埋め込むのが我慢ならない人?
876デフォルトの名無しさん:2005/06/25(土) 00:33:36
int型と明示したmainじゃないと鳥肌が立っちゃう人かと。
877871:2005/06/25(土) 00:38:03
>872
それは、あまりにくだらないことを書いたテキストであるということでしょうか?
それとも、私がテキストを写し間違えたということでしょうか?
>873
確かに頭にも問題が多々ありますが、ご指導願えませんか?
>874
はい。
878デフォルトの名無しさん:2005/06/25(土) 00:38:08
じゃあK&Rは捨てろってことか
879デフォルトの名無しさん:2005/06/25(土) 00:38:56
>>877
偏屈野郎の下らない宗教戦争みたいなもんだ、気にするな
880デフォルトの名無しさん:2005/06/25(土) 00:40:19
>>871
ilink32.cfgじゃなくて、bcc32.cfgじゃね?
書いたならその内容を張ってみろ。
881871:2005/06/25(土) 00:43:02
>>880
-I"C:\Borland\Bcc55\include"
-L"C:\Borland\Bcc55\lib"

です
882デフォルトの名無しさん:2005/06/25(土) 00:46:05
>>871
別に問題なさげに見えるな。
uuid.libだけ見つからないのはおかしい。
そのファイルを確認してみてくれ。
或いは再インスコした方が早いかもしれん。
その手のトラブルな気が少しするわ。
libにディスクチェックもしてみて。
883871:2005/06/25(土) 00:46:55
>882
はい。ありがとうございます。
884デフォルトの名無しさん:2005/06/25(土) 00:51:00
つか、そんなコードでなぜuuid.libなんぞ探すんだ
腐ってるな、bccって
885871:2005/06/25(土) 00:54:36
再インストールして最初からやってみたらうまくいきました。
どうもありがとうございました。
886850:2005/06/25(土) 00:56:33
>>852
書き忘れてましたけど、ファイル出力までに関数でstrの値を決めてます
887デフォルトの名無しさん:2005/06/25(土) 00:58:58
>>886
そこの処理を書け
おそらくそこが間違っている
888デフォルトの名無しさん:2005/06/25(土) 01:01:24
>>886
悪いこたぁ言わねぇからstr定義辺りも含めて全文貼って味噌。
889デフォルトの名無しさん:2005/06/25(土) 01:03:37
たまには悪い事も言って欲しい。
890デフォルトの名無しさん:2005/06/25(土) 01:16:46
>>889
猫おすすめ
891デフォルトの名無しさん:2005/06/25(土) 02:14:25
本日よりC言語の勉強を開始することとなりました。
コンパイラにBorland C++ Compiler 5.5をインストールし設定しました。
2種類のcfgを設定し、コマンドプロンプトで「bcc32」「path」と入力し
確認?をしてみました。
で、実際にメモ帳にて「test.c」を作成しコンパイルを実行すると
test.cは見つかりません。という表示が出ます。
どこの設定が間違っているのでしょうか?


892デフォルトの名無しさん:2005/06/25(土) 02:15:59
893デフォルトの名無しさん:2005/06/25(土) 02:18:17
すみませんでした、ここに来るには早すぎたようです・・・。
誘導ありがとうございます!
894デフォルトの名無しさん:2005/06/25(土) 04:32:37
ヒープサイズ、スタックサイズの他に、
グローバル変数の置かれる領域(名前は忘れた)のサイズも
コンパイラに指定することは可能なのでしょうか?
(コンパイラによっては)

グローバル変数の置かれる場所の専用語句が分かれば
検索できそうなのですが。
895デフォルトの名無しさん:2005/06/25(土) 04:35:07
>>894 data bss
896デフォルトの名無しさん:2005/06/25(土) 04:40:27
>>894
可能。
>895の言うヤツで、これらをセグメントという。
897デフォルトの名無しさん:2005/06/25(土) 05:30:54
今、大学4年で来年から某自動車会社で働く予定です。
現在卒研で熱物質移動の可視化のために画像処理系の研究を
行っています。ソフトはC++Builder.6を使用しています。
そこで質問なのですがプログラミングのスキルが生産技術部
で役に立つのかどうかしりたくてここに書き込みました。
どうか回答宜しくお願いします。
898デフォルトの名無しさん:2005/06/25(土) 07:56:34
役立つつというか、役だて!
899デフォルトの名無しさん:2005/06/25(土) 09:31:02
役立つ、というか役立てろ。
900デフォルトの名無しさん:2005/06/25(土) 10:37:32
>>897
自動車メーカーなら開発部門でプログラミングしているかもしれない。
プログラミング能力よりも、物理知識の方が重要かもしれないけど。
901デフォルトの名無しさん:2005/06/25(土) 15:23:05
それ以前にFORTRANでも使ってたら、一から勉強しなおしだ。
902デフォルトの名無しさん:2005/06/25(土) 15:56:52
ハァ?
903デフォルトの名無しさん:2005/06/25(土) 18:38:41
struct ques
{
double x;
double y;
};

という構造体を配列にして、中の値を隣り合った配列の値とやり取りして
計算するようなプログラムを書いているのですが、実行後エラーが出て
質問に伺いました。

ques q[5];
ques *qp;
qp=(ques*)malloc(sizeof(ques)*5);
として
*(qp+i).x=q[i-1].x+q[i].x+q[i+1].x
などと連続計算して、printf関数で出力した後
q[i].x=(qp+i)->x
と再代入してから
free(qp)

とするという計算をしているのですが、
計算はしてくれるのですが(連続計算にしていますが
最後までやってくれます)、プログラムを閉じる段階でエラーが出てしまいます

何か消し忘れているのでしょうか?ご指導お願いします
904デフォルトの名無しさん:2005/06/25(土) 18:43:38
>>903
全文晒したら?

それはさておき、*(qp+i)はqp[i]に、(qp+i)->xはqp[i].xと書いた方が直感的だと思うが。
905903:2005/06/25(土) 19:12:49
では晒します
#include<stdio.h>
#include<stdlib.h>

struct ques
{
double x;
double y
};

int main()
{
ques q[3];
ques *qp;
int count;
int i;

for(i=0;i<3;i++)
{
 qp->x=0;
 qp->y=0;//初期化です
}
q[0].x=2;
q[0].y=4;
q[1].x=0;
q[1].y=0;
q[2].x=1;
q[2].y=3;
906デフォルトの名無しさん:2005/06/25(土) 19:21:34
>>905
qp の初期化がないぞ。
907903:2005/06/25(土) 19:35:32
続きです
for(i=0;i<3;i++)
{
printf("q[%d].x=%lf,q[%d].y=%lf\n",i,q[i],x,i,q[i],y);
}

while(count<0)
{
qp=(ques*)malloc(sizeof(ques)*5);
qp[0].x=q[0].x+q[1].x;
qp[0].y=q[0].y+q[1].y;
qp[0].x=q[0].x+q[1].x+qp[2].x;
qp[0].y=q[0].y+q[1].y+qp[2].y;
qp[2].x=q[2].x+q[1].x;
qp[2].y=q[2].y+q[1].y;

for(i=0;i<3;i++)
{
 printf("q[%d].x=%lf,q[%d].y=%lf\n",i,qp[i],x,i,qp[i],y);
 q[i].x=qp[i].x;
 q[i].y=qp[i].y;
}
count++;
}
return 0;
}

>>905この内容だと、qp自身の初期化はどこで行うべきでしょうか
908デフォルトの名無しさん:2005/06/25(土) 19:36:40
最初のループの前に
qp = q;
とでもやるんだな
909903:2005/06/25(土) 19:51:06
おお、動きました!!
>>904 >>906 >>908
有難うございました!!!
910デフォルトの名無しさん:2005/06/25(土) 20:26:28
あああーーーもう、本当に俺は・・・。
cinとcoutで>>と<<の区別が付かない。
うまい覚え方ってないかな?自分の中ではこれが壁だ。
後はif文でどう使えばうまくいけるのかとかあるけど、本格的に迷っているのは>>と<<の区別。
これさえうまくいけば後はうまくいけると思う。
911デフォルトの名無しさん:2005/06/25(土) 20:30:01
>>910
矢印だと思えばいいだろ。

//文字列aaaをcoutに送る
cout << "aaa";
//cinの内容をxに送る
cin >> x;


//うはwwwwwwうんこwwwww
"aaa" >> cout;
912デフォルトの名無しさん:2005/06/25(土) 20:30:24
オーバーロードの悪い見本だから、覚えないほうがよい。
913デフォルトの名無しさん:2005/06/25(土) 20:32:46
cinだとかcoutだとか、マジでつかわねー
マニュピレータでごちゃごちゃやんの、ウゼエんだよ
printfでぜんぜん困ってない
まあsprintfよりはstrstream、なのか?という気はせんでもないが

MFCユーザとかだと、みなCString#Format()だろうな
914デフォルトの名無しさん:2005/06/25(土) 20:39:43
なんで、
CString::CString( const char*,...)
static CString CString::Format( const char *, ...)
みたいなのが無いんだろう……
915デフォルトの名無しさん:2005/06/25(土) 20:40:43
そんな貴方にboost::format
916デフォルトの名無しさん:2005/06/25(土) 20:44:26
>>915
それそれ。もうstrstreamなんていらないね。
917デフォルトの名無しさん:2005/06/25(土) 22:00:16
それ以上にlexical_castで十分なことも多い。
918デフォルトの名無しさん:2005/06/26(日) 00:16:43
× strstream
○ stringstream
919デフォルトの名無しさん:2005/06/26(日) 00:22:16
jet_stream_attack(int gaia, int mash, int ortega);
920デフォルトの名無しさん:2005/06/26(日) 00:49:14
unsigned int *tmp = abc->def;
cout << tmp << endl;
これで0x19と出るが
unsigned int *tmp = abc->def;
cout << *tmp << endl;
これだとセグメンテーション違反と言われます。
これはどんな原因が考えられますか?
0x19からsizeof(unsigned int)分のデータの中に不正なデータがあるということでしょうか?
でも数値として解釈して出力するだけだからどんなビット列でも良いはずだし・・・
921デフォルトの名無しさん:2005/06/26(日) 00:55:34
>>920
表示されたエラーメッセージの意味ぐらい調べような。
922デフォルトの名無しさん:2005/06/26(日) 00:57:22
>>920
C言語 ポインタ でぐぐれ
923デフォルトの名無しさん:2005/06/26(日) 01:15:36
そりゃ、0x19番地のメモリを読み出そうとするわけだから
保護機能がちゃんと働くOSなら、エラーになって強制停止させられるでしょうな
924デフォルトの名無しさん:2005/06/26(日) 01:52:15
>>914
っ[ AnsiString& AnsiString::sprintf(const char* format, ...) ]
925デフォルトの名無しさん:2005/06/26(日) 09:31:41
C言語初めて一週間ぐらいの初心者ですが、フリーでお勧めのエディタなどありますか?
現在はTeraPadというソフトを使っているのですが、若干使いづらいので。
926デフォルトの名無しさん:2005/06/26(日) 09:44:17
フリーなのにあれで不満言うとか、贅沢すぎ
927デフォルトの名無しさん:2005/06/26(日) 10:22:36
notepadで十分
928デフォルトの名無しさん:2005/06/26(日) 10:26:05
>>925
そういう質問するときは「若干使いづらいので」と思っている理由を明確にする。
それが出来ないなら、窓の杜やVectorで一覧当たるのと得られる情報は変わらない。

プログラマならemacsかvi。
それで満足できないなら、どんなフリーのエディタを使っても満足できないと思う。
929デフォルトの名無しさん:2005/06/26(日) 10:52:43
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
930デフォルトの名無しさん:2005/06/26(日) 10:59:27
notepadに毛の生えたようなneditもry
931デフォルトの名無しさん:2005/06/26(日) 11:26:02
マジレスしておこうか。
emacs系ならxyzzyが手頃。vi系ならviviかな。
Windowsらしいインターフェースがいいなら桜エディタとかPeggyかな。
932デフォルトの名無しさん:2005/06/26(日) 11:31:46
質問があります。共用体の初期化で困っています。

int main()
{
 union
 {
  char ch;
  int i;
 };

 return 0;
}

こういう共用体があったときに、
 ch = 0;
 i = 0;
というように全部の値を初期化する必要があるのですか?
それとも ch = 0; と書くだけで、よりサイズが大きなメンバも一緒に初期化してくれるのでしょうか?
933デフォルトの名無しさん:2005/06/26(日) 11:34:03
>>932

union HOGE
{
 char ch;
 int i;
};

int main()
{
 HOGE hoge;
 memset(&hoge, 0, sizeof(HOGE));

 return 0;
}
934デフォルトの名無しさん:2005/06/26(日) 11:37:10
int main()
{
 union
 {
  char ch;
  int i;
 } HOGE;
memset(&hoge, 0, sizeof(hoge));
 return 0;
}
935デフォルトの名無しさん:2005/06/26(日) 11:41:25
>>933-934
レスありがとうございます。
なるほどsizeof してからmemset()するべきですか。
そのように実装します、助かりました〜。
936デフォルトの名無しさん:2005/06/26(日) 11:59:39
>>935
浮動小数点数とかポインタとか入れたときは memset() じゃぁダメ(かもしれない)。
937デフォルトの名無しさん:2005/06/26(日) 12:14:25
0初期化するだけなんだから問題無いだろ

>>934
オマエそんな宣言してないhogeを操作しようとしてるソースを書くんじゃねぇ
938デフォルトの名無しさん:2005/06/26(日) 12:17:50
>>937
浮動小数点数とかポインタとかを memset で 0 埋めしても
0 で初期化したことにはならない(かもしれない)。
939デフォルトの名無しさん:2005/06/26(日) 12:18:21
int main() 

  union 
  { 
    char ch; 
    int i; 
  } hoge = {0};
  
  return 0; 
}
940デフォルトの名無しさん:2005/06/26(日) 12:20:24
>>936
932です、もう少し質問させて下さい。

union HOGE
{
 char ch;
 int i;
 float f;
};

int main()
{
 HOGE hoge;
 memset(&hoge, 0, sizeof(HOGE));

 //判定
 if(hoge.f == 0) printf("初期化されたよ \n");

 return 0;
}

こういうように書いても判定がうまく行かない(場合がある)ということでしょうか?
もしそうなら初期化に依存したソースは書かない方がよさげですね。
941デフォルトの名無しさん:2005/06/26(日) 12:20:51
浮動小数まで考慮したら、もはや単純な記述では無理だな。共用体だし。
それぞれの型に合わせた初期化関数を用意しなけりゃならんだろ。
942デフォルトの名無しさん:2005/06/26(日) 12:56:23
整数と浮動小数をunionするもんじゃねぇな
943デフォルトの名無しさん:2005/06/26(日) 13:03:56
ていうか
union HOGE {
  char ch[sizeof(int)];
  int i;
};
じゃなくて大丈夫なの?
944デフォルトの名無しさん:2005/06/26(日) 13:05:35
何が?
945デフォルトの名無しさん:2005/06/26(日) 13:13:44
>>941
IEEE754では0.0fが0x00000000になることが保証されていますが?
946デフォルトの名無しさん:2005/06/26(日) 13:21:20
NULLは?
947デフォルトの名無しさん:2005/06/26(日) 13:21:38
>>945
プログラミング言語CおよびC++では保証されていない。
948デフォルトの名無しさん:2005/06/26(日) 13:24:05
NULLは保証されてないよ。
組込み系では0にジャンプするとリセットしたりするからな。

IEEEの話はあくまでそれを採用してるプロセッサの上での話しだが、
いまさら標準でない(IBM形式とか)の為に騒ぐ必要もなかろう。
949デフォルトの名無しさん:2005/06/26(日) 13:29:39
>>948
この流れで、IEEEが「標準」であるかのような言い方は感心できんな。
950デフォルトの名無しさん:2005/06/26(日) 13:30:37
>>947
CおよびC++で754以外の浮動小数点を扱ってる処理系とプロセッサを挙げよ。
現存するもので。

保証されていないのは確かだが、保証されることを期待して実装する訳ではないし、
保証されることが目的でもない。
実質的な標準を軸にして判断するのが、妥当だとは思わないか?
951デフォルトの名無しさん:2005/06/26(日) 13:33:31
数学者と工学者の違いだな。
952デフォルトの名無しさん:2005/06/26(日) 13:43:20
>>950
そんな処理系もプロセッサも知らないんで、挙げられないよ。
でもそれは言語での保証が無いこととはまったく関係ないよ。

あんたが言語としての保証を必要としないのはわかった。
でもそれは言語での保証が無いこととは関係ないよ。
(あんたがC/C++標準委員会のコアメンバーでもなければね。)
953デフォルトの名無しさん:2005/06/26(日) 14:01:16
>>952は保証を軸にしてて、漏れは実質的標準を軸にして話してた訳か。
ちょっと不毛だった。

ただな、言語での保証が無いこととは関係ないが、実装には関係する。
浮動小数点に限らず、規定されていない範囲のことがな。
漏れはそういう視点から話してた訳。
954デフォルトの名無しさん:2005/06/26(日) 14:22:36
ここはプログラミング言語C/C++のスレでございます

>>943
unionが何なのか知らんだろオマエ
955デフォルトの名無しさん:2005/06/26(日) 14:39:15
>>951
このスレは機種依存OKだから、標準が外れていることを指摘しつつも
現実的な回答をするのが筋だろうな。つまり、数学者的な思考を提示
しつつも工学者的な選択枝を提供する、と。だから、>>945>>947
反発しあう必要もなく、両方の意見を聞いて、結局どうするべきかは
質問者が決めればいい。
956デフォルトの名無しさん:2005/06/26(日) 16:17:51
>>954
はぁ…?
知ってるからこそビット幅合わせないで
一体どんな目的に使うのか謎なんだけど
957デフォルトの名無しさん:2005/06/26(日) 16:27:55
>>956
unionの存在意義がわかってないな
958デフォルトの名無しさん:2005/06/26(日) 16:30:39
>>956
char と int を重ねるってだけでも十分意味を成す場面があるだろう。
自分の知っている特定用途以外想像できないのを偉そうに言うなよ。
959デフォルトの名無しさん:2005/06/26(日) 16:54:07
>>958
大抵うまくいくだろうが、一応規格外だ。

こういうのも見るけど、規格外なんだよな。
union {
struct { float v[3]; } vec;
struct { float x, y, z; } elem;
};
960デフォルトの名無しさん:2005/06/26(日) 17:03:25
>>959
何が言いたいのかわからんな。
&vec.v[1] == &elem.y が保証されてないって話か?
char と int を重ねたいだけの話には関係ないんじゃない?
961デフォルトの名無しさん:2005/06/26(日) 17:10:29
呼び出された関数内では、呼び出し元のローカル変数を参照することってできないんですか?
もちろん引数は使わないで。
下記のようなことがしたいのですが……

void sub_func()
{
int x=x_main;
}

void main_func()
{
int x_main=255;
sub_func();
}
962デフォルトの名無しさん:2005/06/26(日) 17:11:29
>>960
>959は、きっと自分だけしか知らないノウハウを基準に>958を解釈しているんだよ。
963デフォルトの名無しさん:2005/06/26(日) 17:12:46
>>961
それができるのならローカル変数の意味がなくなってしまう。
どうしても引き数で渡すのがいやなら外部で定義するかC++ならクラスを利用しろ。
964デフォルトの名無しさん:2005/06/26(日) 17:13:45
>>961
無理
グローバル変数を経由するとかすればできるけど

つうかそんな事できたらグローバル変数とかわらんだろ
965デフォルトの名無しさん:2005/06/26(日) 17:14:50
そういう変態機能がEmacs Lispにあったような・・・
なんじゃこりゃーって感じだった
966デフォルトの名無しさん:2005/06/26(日) 17:17:23
関数内でスタックをごにょごにょすればできるやもしれん
環境依存だけど
967デフォルトの名無しさん:2005/06/26(日) 17:41:32
そこでファイルスコープですよ。
968デフォルトの名無しさん:2005/06/26(日) 17:43:37
いやC/C++では出来ませんでいいだろ。
969デフォルトの名無しさん:2005/06/26(日) 17:51:04
そこでlongjmp
970デフォルトの名無しさん:2005/06/26(日) 17:59:09
>959
union 使って↓な使い方することがあるんだよ。
つまり、union 内の型の間で変換はせず、サイズ節約のために使う。
そして >958 を読んでその意味を噛み締めてくれ。

typedef strcut {
 enum { CHAR, INT, FLOAT, STRING } tag;
 union {
  char c;
  int n;
  float f;
  char *str;
 } data;
} VARIANT;

void func(VARIANT v)
{
 switch(v.tag) {
 case CHAR:
  printf("%c", v.c);
  break;
 case INT:
  printf("%d", v.n);
  break;
 }
}
971970:2005/06/26(日) 18:03:03
えらそうなこと書いておきながら凡ミス。
v.c じゃなくて v.data.c、v.n じゃなくて v.data.n だな。
自分でやるときには無名共用体を使うから間違えた。
972デフォルトの名無しさん:2005/06/26(日) 18:23:16
ダイナミックスコープ自体はサポートしてる言語あるじゃん。
Emacs Lisp とか Perl とか。
ttp://ja.wikipedia.org/wiki/動的スコープ
なのでやっぱり >968 なんじゃね?
973デフォルトの名無しさん:2005/06/26(日) 20:02:34
5桁のフィールドに対応した値 unsigned x = 15 があって、
std::vector<char> v に対して '0' '0' '0' '1' '5' の順で push_back() したいとき
(またはそれと等価な結果を得たいとき)
エレガントな方法は?

974デフォルトの名無しさん:2005/06/26(日) 20:08:03
>>973
size_t const end = v.size();
v.resize(end + 5 + 1);
sprintf(&v[end], "%05u", x);
v.resize(end + 5);
975デフォルトの名無しさん:2005/06/26(日) 20:26:43
>>970
で?それと、char c[sizeof(int)]となんの関係があると?
976959:2005/06/26(日) 21:06:38
>>970
いや、別に、ごく一般的なunionの用法なんですが・・・。
975と被るが、それとchar c[sizeof(int)]と何の関係があるの?
てっきりintをバイト単位でアクセスできることかと思ってたんだが。
それとも3バイト埋めることが合理的という事?
977デフォルトの名無しさん:2005/06/26(日) 21:14:55
多分970と959は畑が違うから相容れ無いはず。
970はLPARAM WPARAMなどを扱うWin系
959はWin以外の何かの畑の人とみた
978デフォルトの名無しさん:2005/06/26(日) 21:17:05
興味で訊くんですが、unionの他の使い方ってどんなのがあるんでしょう?
979デフォルトの名無しさん:2005/06/26(日) 21:18:04
>>943の例はただのキャストで置き換え可能なケースが多い気も
ワード境界に整列するようにアロケートしたいときとかに使うぐらいかな
malloc()の実装とかだと、さらにdoubleとかもメンバに入れるよな

>>970の例が、一番典型的なunionの使い方だと思う
型フィールド付+メモリ節約
まあ、C++なら邪悪とされるスタイルだが
980デフォルトの名無しさん:2005/06/26(日) 21:27:25
970マダー?
981975:2005/06/26(日) 21:28:28
>>977
俺ぁ激しくWinだが、char c[sizeof(int)]なんてやんない
982デフォルトの名無しさん:2005/06/26(日) 21:52:53
まぁWinsockにも使われている手法だから環境を限定させれば悪くは無い。
983デフォルトの名無しさん:2005/06/26(日) 21:55:12
> C++なら邪悪とされる
のはなんで?
984デフォルトの名無しさん:2005/06/26(日) 21:56:19
>>983
型フィールドみたいなものを使うぐらいなら継承を使え
というのがBjarne Stroustrup様の有難い教えです
985デフォルトの名無しさん:2005/06/26(日) 21:56:20
コンストラクタとかデストラクタとか
986デフォルトの名無しさん:2005/06/26(日) 21:56:24
素直にクラス+多態しろって事じゃないの
987デフォルトの名無しさん:2005/06/26(日) 21:59:04
>>983
オブジェクトにして渡した方がいいって話とかじゃないかな、switchいらんし。
先の例ではメンバが増えると、caseも増える。
988デフォルトの名無しさん:2005/06/26(日) 21:59:36
>>983
型で決められたメソッドを敢えて場合分けの嵐にする設計が美しくない。
というかC++の設計思想に反する。
989デフォルトの名無しさん:2005/06/26(日) 21:59:50
そうか、トンくす
990デフォルトの名無しさん:2005/06/26(日) 22:03:48
>>983大人気だな(w
991デフォルトの名無しさん:2005/06/26(日) 22:07:19
次スレ立てられなかった。
992デフォルトの名無しさん:2005/06/26(日) 22:20:53
関数のポインタの有効な使用方法ってどんなのがありますか?
入門書にのっている例文で有効そうなのは見つかりませんでした

そこからは見えない関数を渡してあげる以外に有効な方法ありますでしょうか?
993デフォルトの名無しさん:2005/06/26(日) 22:22:02
qsort
994デフォルトの名無しさん:2005/06/26(日) 22:22:27
ありとあらゆる種類のコールバック
995デフォルトの名無しさん:2005/06/26(日) 22:23:47
ファンクションテーブルによるイベントディスパッチ
996デフォルトの名無しさん:2005/06/26(日) 22:24:57
要するにテンプレートメソッドパターン
997992:2005/06/26(日) 22:37:38
勉強になります。ありがとうございました
998デフォルトの名無しさん:2005/06/26(日) 22:39:07
次スレマダー?チンチン
999デフォルトの名無しさん:2005/06/26(日) 22:45:43
【初心者歓迎】C/C++室 Ver.19【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
1000デフォルトの名無しさん:2005/06/26(日) 22:46:22
#include <iostream>
int main()
{
  std::cerr << "1000" << std::endl;
  return 0;
}
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。