つか、やればできるみたいな事言いながら出来ない愚痴を聞かされてもな。
924 :
デフォルトの名無しさん:04/08/08 01:01
#include <stdio.h>
int main (void){
int x[10]={1,2,3,4,5,6,7,8,9,10};
int *y,i;
y=x+2;
for(i=0;i<10;i++){
printf("x[%d]=%d\n",i,*y);
y++;
}
return (0);
}
このプログラムでx[0]のアドレスを(y=x)の時は問題ないのですがx[2]のアドレス(y=2)を出力
しようとするとx[0]=3から出力されるのですが、x[8],x[9]あたりで変な値が出て困ってます。
int x[10]の最後の値 10で止まるようなプログラムの場合はどうしたらよいのでしょうか?
どなた様かお力を貸してください。
スレ違い
ポインタが理解出来ていないのが原因。セグフォ。
お前、y=x+2;でx[]のそれぞれの値に2を足した配列のポインタが
yに代入されると思ってないか?(そんなMathematicaじゃあるまいし)
y=x+2でyはx[2]を指す。y++;でx[3],x[4]…と指す先が変わって
いくからyがx+10になった時点でおかしくなるのは当たり前だ。
何をしたいのか分からん。
927 :
デフォルトの名無しさん:04/08/08 01:30
924はネタだろ
928 :
デフォルトの名無しさん:04/08/08 01:38
ネタではないのですが・・・ors
質問の仕方が悪かったと思います。スイマセン
このプログラムを実行すると
x[0]=3
x[1]=4
x[2]=5
x[3]=6
x[4]=7
x[5]=8
x[6]=9
x[7]=10
x[8]=1245120
x[9]=4199081
となります。これをx[7]=10で止めるようなプログラムを作成して
いただきたいのですが
#include <stdio.h>
int main (void){
int x[10]={1,2,3,4,5,6,7,8,9,10};
int *y,i;
y=x+2;
while(y <= &x[9]){
for(i=0;i<10;i++){
printf("x[%d]=%d\n",i,*y);
y++;
}
return (0);
}
#include <stdio.h>
int main (void){
int x[10]={1,2,3,4,5,6,7,8,9,10};
int *y,i;
y=x+2;
while(y <= &x[9]){
printf("x[%d]=%d\n",i,*y);
y++;
}
return (0);
}
放っといてくれ!
935 :
デフォルトの名無しさん:04/08/08 01:56
>>930 解答のほどありがとうございます。
ですが930さんのプログラムを実行させていただきますと
iがないのでxの中身が変になりました。
x[-858993460]=3
x[-858993460]=4
x[-858993460]=5
x[-858993460]=6
x[-858993460]=7
x[-858993460]=8
x[-858993460]=9
x[-858993460]=10
iがないxなんて・・・
930さんはもう嫌になってますよ
あなたとはもうやっていけないわ
いや、そもそも
>>924は誤解していると思うのだが。表示は
x[0]=3
x[1]=4
…
となっていてもx[0]==1、x[1]==2…のままだぞ。それは分かってるのか?
それでいいなら
#include <stdio.h>
int main (void){
int x[10]={1,2,3,4,5,6,7,8,9,10};
int *y,i;
y=x+2;
for(i=0;i<10-2;i++){
printf("x[%d]=%d\n",i,*y);
y++;
}
return 0;
}
でいいんじゃないのか?
あ、ちとインデント間違えた。
941 :
デフォルトの名無しさん:04/08/08 02:39
>>939 (926)
表示はそのままでよかったです。
ホントありがとうございました。
助かったです。
これ教えてください(つд`)
身体測定のデータ処理を行いたい。番号(2桁の整数)と身長、体重、性別のデータを持つ構造体を作り20人分のデータを扱えるようにしてください。
・入力されたデータから身長と体重の最大、最小値と平均値を性別ごとに求めるプログラムを作ってください。
・番号を入力することで、その人の身長、体重、性別の各データを表示できるようにしてください。
この時、次の式を使って、標準体重からの差も表示しなさい。
標準体重 = (身長-100)x0.9
身長は150cmから180ab
体重は45`cから90`c
の範囲で生成せきるようにしてください。
性別は男性:0,女性:1としてください。
データは以下の構造体を用いてください。
struct person{
int number;
int height;
int weight;
int sex;
}
int main()
{
struct person data[20];
return 0;
}
806 == 942 なのか?
次スレの立て方についてどうぞ
どなたかお助けください
テキストファイルに、1〜nまでの素数を書き込む関数fileSosu()を作成せよ。
void fileSosu( char *fileName, int n )
・fileName : 素数を書き込むファイル名
・n : 素数を求める最大数
上記の関数を以下のプログラムで実行し1〜100までの素数がファイルに出力されたか動作を確認せよ。
#include <stdio.h>
//ここにfileSosu()関数を書く。
void main()
{
//ファイル名を格納する文字列
char wFileName[20];
printf("素数を出力するファイル名=");
//ファイル名をキーボードから入力する
scanf("%s", wFileName );
fileSosu( wFileName, 100 );
}
前すれで聞いた時は流れてしまって、でっちあげて提出したら「お前がやるのは再提出問題で、これは元になった問題の回答だ」と言われました
元になった問題も張りますので、どうにかお助けを_| ̄|○
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=302
void fileSosu( char *fileName, int n )
{
FILE *fp;
int *prime, i, j;
fp = fopen(fileName, "w");
if(fp == NULL) return;
prime = calloc(sizeof(int), n+1);
if(prime == NULL) return;
for(i = 2; i <= n; i++){
for(j = i * 2; j <= n; j += i)
prime[j] = 1;
if(prime[i] == 0){
if(i > 2) fputc('\n', fp);
fprintf(fp, "%d", i);
}
}
fclose(fp);
free(prime);
return;
}
こんな感じか?
>>948 void fileSosu(char *const filename, const int n)
{
int i;
FILE *out = fopen(filename, "w");
for(i = 2; i <= n; i++)
{
int j;
for(j = 2; j < i; j++)
if(i % j == 0)
goto not_prime;
fprintf(out, "%d\n", i);
not_prime:;
}
fclose(out);
}
かぶったうえに明らかに拙い…
欝だ死のう
>>949 合成数でもふるいを更新するならフルイのアルゴリズムの利点が無くないか?
for(i = 2; i <= n; i++){
...
}
↓
for(i = 2; i <= n; i++){
if(prime[i] == 0){
for(j = i * 2; j <= n; j += i)
prime[j] = 1;
if(i > 2) fputc('\n', fp);
fprintf(fp, "%d", i);
}
}
これで大丈夫かなぁ・・・
埋め立てちう
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
class FDS : public std::set<int> {
private:
fd_set fds;
iterator it;
public:
int fd_max() const { return *max_element(begin(),end()); }
fd_set *fdset(){
it=begin();
FD_ZERO(&fds);
iterator itt;
for(itt=begin();itt!=end();++itt){
FD_SET(*it,&fds);
}
return &fds;
}
int active_fd(){
for(;it!=end();++it)
if( FD_ISSET(*it,&fds) ) return *it++;
return -1;
}
};
struct {
pthread_mutex_t mutex;
pthread_cond_t cond, finish;
int count, nmenber;
void join(){
pthread_mutex_lock(&mutex);
if( ++count!=nmenber ) pthread_cond_wait(&cond,&mutex);
else pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
void oneless(){
pthread_mutex_lock(&mutex);
if( count==--nmenber ) pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mutex);
}
void onedead(){
pthread_mutex_lock(&mutex);
if( !--count ) pthread_cond_broadcast(&finish);
pthread_mutex_unlock(&mutex);
}
bool end(){ return count<2; }
void wait(){
pthread_mutex_lock(&mutex);
pthread_cond_wait(&finish,&mutex);
pthread_mutex_unlock(&mutex); }
} thread_starter = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER,
0 };
struct thread_data {
pthread_t th;
int pipe[2];
};
std::vector<thread_data*> vec_thread;
time_t base_sec = 0;
const char*const msg[] = {
"%dは%dに斬りかかった",
"%dは%dに銃口を向けた",
"%dは%dに呪文を唱えた",
"%dは%dにぬるぽ",
"%dは%dにガッ!",
};
void *student_thread(void *input){
pthread_mutex_t mystart_mutex = PTHREAD_MUTEX_INITIALIZER;
thread_data *arg = (thread_data*)input;
thread_data *data;
int nwrite;
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGTERM);
sigprocmask(SIG_BLOCK, &sigset, NULL);
thread_starter.join();
do{
sleep(rand()%5+1);
sigpending(&sigset);
time_t sec;
int len;
char buf[100];
sec=time(0)-base_sec;
write(arg->pipe[1],&sec,sizeof(time_t));
if( thread_starter.end() ){
snprintf(buf,sizeof(buf),"%dが生き残った",arg->th);
}else if( sigismember(&sigset,SIGTERM) ){
snprintf(buf,sizeof(buf),"%dは死んだ",arg->th);
}else{
data = vec_thread[rand()%vec_thread.size()];
if( arg != data )
snprintf(buf,sizeof(buf),msg[rand()%(sizeof(msg)/sizeof(msg[0]))],arg->th,data->th);
else
snprintf(buf,sizeof(buf),"%dは身を投げた!!!",arg->th);
if( pthread_kill(data->th, SIGTERM) )
strcat(buf," ミス");
};
len=strlen(buf)+1;
write(arg->pipe[1],&len,sizeof(int));
write(arg->pipe[1],buf,len);
}while( !thread_starter.end() && !sigismember(&sigset,SIGTERM) );
close(arg->pipe[1]);
thread_starter.onedead();
return NULL;
}
void log_process(FDS &fds){
std::multimap<time_t,char*> map_log;
while( fds.size() ){
int nsel;
if( 0<(nsel=select(fds.fd_max()+1,fds.fdset(),NULL,NULL,NULL)) ){
int fd;
while( (fd=fds.active_fd())>=0 ){
time_t sec;
int msglen;
char *msg;
int nread;
read(fd,&sec,sizeof(time_t));
read(fd,&msglen,sizeof(int));
msg = new char[msglen];
nread=read(fd,msg,msglen);
if( nread > 0 ){
map_log.insert(std::make_pair(sec,msg));
}else{
fds.erase(fd);
close(fd);
}
}
}
}
std::multimap<time_t,char*>::iterator it;
for(it=map_log.begin();it!=map_log.end();++it){
printf("%03dターン: %s\n",it->first,it->second);
}
return;
}
分速500文字級で
>>956がコードを打ってると想像して萌えてみる
int main(int argc, char **argv){
srand(time(0));
int count;
FDS fds;
std::vector<thread_data*>::iterator it;
if( argc<2 ){
fprintf(stderr,"Usage:%s [thread_count]\n",argv[0]);
return 1;
}
for(count=atoi(argv[1]);count;--count){
thread_data *data;
data=new thread_data;
pipe(data->pipe);
vec_thread.push_back(data);
fds.insert(data->pipe[0]);
}
thread_starter.nmenber=fds.size();
pid_t pid=fork();
if( pid<0 ){
abort();
}else if(pid>0){
pid=fork();
if(pid<0) abort();
else if(pid>0) return 0;
for(it=vec_thread.begin();it!=vec_thread.end();++it){
close((*it)->pipe[1]);
delete *it;
}
vec_thread.clear();
log_process(fds);
return 0;
}
close(0); close(1); close(2);
setpgid(0,0);
for(it=vec_thread.begin();it!=vec_thread.end();++it){
thread_data *data=*it;
close(data->pipe[0]);
if( pthread_create(&(data->th), NULL, student_thread, data) ){
close(data->pipe[1]);
delete data;
vec_thread.erase(it);
thread_starter.oneless();
continue;
}
}
time(&base_sec);
thread_starter.wait();
return 0;
}
>>963 ふふふ
コピペとSTLの力は偉大なのだよ
>>957 dクス
でも、HttpDownLoader(偽) と簡易シェルを作って終わりにしちった
許してくれ
ちなみに、使用可能なのは C であって、C++ ではないらしい
とても愉快なうちのPCルーム
しかしコンパイルできない
しかし,埋まらない。
ところで,何がコンパイルできないとお悩みじゃ,お若いの?
>>970 /home/hoge/tmp/ccsX09Q1.o(.text+0x210): In function `student_thread(void*)':
: undefined reference to `pthread_kill'
collect2: ld はステータス 1 で終了しました
gcc3.3.2
コンパイルオプションを教えて.
そりゃ,コンパイルエラーじゃねぇ,リンクエラー。
キミの任務はpthread用のライブラリをリンクすることだ。
リンカオプション -lpthread を活用したまへ。